Pointer is missing a nullability type specifier (__nonnull or __nullable)

时间:2022-01-07 17:31:14

我们都知道在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的时候只要加上这两个属性 进行说明就不会有警告了