有人可以详细解释为什么在iOS 9中引入了nonnull
?
例如,NSArray
方法+ (instancetype)array;
现在是+ (instancetype nonnull)array;
这是一个客观的c级功能,它会如何影响现有的应用程序?
答案 0 :(得分:17)
他们确保无论类型何处都不可为空,它现在都是nonnull
类型。
与之前的NSMutableArray addObject
方法一样
- (void)addObject:(ObjectType)anObject
现在已更改为
- (void)addObject:(ObjectType nonnull)anObject
因此,这意味着您无法将null对象(nil
)传递给此方法。同样的,在你的情况下
+ (instancetype nonnull) array
方法永远不会返回nil
。
答案 1 :(得分:9)
nonnull
是一个关键字,用于告诉编译器返回值(或参数或属性)永远不会为nil。这是在早期版本的Xcode中引入的,以便在Obj-C和Swift的可选类型之间实现更好的互操作性。
答案 2 :(得分:3)
nonnull
是一个关键字,它通知编译器object / parameters返回的值永远不会是nil
。
一般来说,你应该大致看待可空和非空的方式 你目前使用断言或例外:违反合同是 程序员错误。特别是,返回值是你的意思 控制,所以你永远不应该返回nil作为不可为空的返回类型 除非是为了向后兼容。
答案 3 :(得分:0)
引入了nullable和nonnull,使Objective C和Swift的互操作性更容易。
目标C在可选参考和非可选参考之间没有任何区别。然后Swift编译器无法确定对Objective C代码的特定引用是否可选。
可空注释与Swift中的可选注释相同。 非空注释与Swift中的非可选注释相同。
经验法则是任何简单的指针类型都将被假定为非空(有关详细信息,请阅读the official Swift blog)
我还要说这个新的注释也会从Objective C的角度提高代码质量。我通常想知道如果传递nil作为参数,应用程序会崩溃吗?例如:
id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];
编译器在这种情况下没有说什么,你的应用程序会在执行时间内崩溃!现在使用这个新注释,您将在编译时看到警告。我知道这个例子很愚蠢,但有些情况下你不知道在调用方法之前是否需要检查属性是否为nil,除非你阅读文档。