我们都知道在swift中,可以使用!和?来表示一个对象是optional的还是non-optional,如view?和view!。而在Objective-C中则没有这一区分,view即可表示这个对象是optional,也可表示是non-optioanl。这样就会造成一个问题:在Swift与Objective-C混编时,Swift编译器并不知道一个Objective-C对象到底是optional还是non-optional,因此这种情况下编译器会隐式地将Objective-C的对象当成是non-optional。
为了解决这个问题,苹果在Xcode 6.3引入了一个Objective-C的新特性:nullability annotations。这一新特性的核心是两个新的类型注释:__nullable和__nonnull。从字面上我们可以猜到,__nullable表示对象可以是NULL或nil,而__nonnull表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。
1 typedef enum : NSUInteger { 2 LoadTypeNew, ///下拉刷新,加载最新数据的状态 3 LoadTypeMore, /// 上拉刷新,加载更多数据的状态 4 LoadTypeSearch /// 控制器搜索数据的状态 5 } LoadType; 6 7 //这个block , 用来解决是不是已经把数据加载完成了(没有更多的数据了) 8 typedef void(^SuccessWithLastBlock)(_Nonnull id success, BOOL last); 9 10 //这个block , 用来解决请求数据出错的情况(包含error 信息 和服务器返回的错误信息,error为空 ,即为服务器错误) 11 typedef void(^ErrorMsgBlock)( NSError * _Nullable error,id _Nullable msgBody); 12 13 @interface QKYBasicDataController : NSObject 14 15 16 @property (nonatomic,strong,nonnull)SuccessWithLastBlock successWithLastBlock; //默认的成功的回调 17 @property (nonatomic,strong,nonnull)SuccessBlock successBlock; //默认的成功的回调 18 @property (nonatomic,strong,nonnull)ErrorMsgBlock errorMsgBlock; //默认的失败的回调 19 20 21 // 传入交互的Block块,这个只是提供一般的例子,在具体的DataController中为了增加可读性,需要自定义 22 -(void)requestDatasWithSusscessBlock: (_Nullable SuccessBlock ) successBlock ErrorMsgBlock:(_Nullable ErrorMsgBlock )errorMsgBlock; 23 @end
上边的代码是一个基础ViewModel的代码,在使用block的时候只要加上这两个属性 进行说明就不会有警告了