我就传个nil,你就给我一个警告,看到警告,我就要消除你
空警告
Null passed to a callee that requires a non-null argument
我在方法传参数的时候,就给我这个警告,这个警告翻译意思就是传递给需要非空参数的被调用者为空值。谷歌翻译的就是这样,其实意思就是我参数是非空的,你传个空的参数给我,我就要给你警告。
这么一想,感觉swift是不是就好多了,对于这方面的安全也做的更好了。
问题解决
既然我想传空的过去,那我在参数里面允许为空就好。
+ (void)didClicklink:(NSString *)link fromVC:(nullable UIViewController *)vc;
在参数那里,添加nullable就好。
那为什么会收到警告呢,我们往下看。
拓展
问题是解决了,那现在我们就开始拓展一下空与非空的知识点吧。
nullable
nullable,可空。我们定义方法或者属性都可以使用nullable来允许参数为空。
@property (nonatomic, copy, nonnull) NSString *name;
- (void)test:(nullable NString *)string;
nonnull
nonnull,不能为空。也是可以定义方法或者属性。
@property (nonatomic, copy, nonnull) NSString *name;
- (void)test:(nonnull NString *)string;
null_resettable
null_resettable,set方法可为空,get方法不能为空。
@property (nonatomic, copy, null_resettable) NSString *name;
- (NSString *)name
{
if (_name == nil ) {
return @"张三";
}
return _name;
}
null_unspecified
null_unspecified,不确定是否为空。
@property (nonatomic, copy, null_unspecified) NSString *name;
NS_ASSUME_NONNULL
我们在新建一个New File ,都会看到被NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END包住。
#ifndef NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#endif
#ifndef NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
#endif
意思是在这里面修饰的属性,默认都为nonnull。当编译时,如果为空,就会收到警告。
大结局了,水落石出了,这就是为什么我们要对参数赋值为nullable,让参数为空,而不会收到警告了。