17

谁能详细说明为什么nonnull在 iOS 9 中引入?

例如,现在的NSArray方法+ (instancetype)array;+ (instancetype nonnull)array;

参考: https ://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

这是一个 Objective-c 级别的功能吗?这将如何影响现有的应用程序?

4

4 回答 4

19

他们确保无论该类型是不是可空的,它现在都是一个nonnull类型。

就像之前的NSMutableArray addObject方法一样

- (void)addObject:(ObjectType)anObject  

现在它已更改为

- (void)addObject:(ObjectType nonnull)anObject

因此,这意味着您不能将空对象 ( nil) 传递给此方法。同样的方式,在你的情况下

+ (instancetype nonnull) array

方法永远不会返回nil

参考:https ://developer.apple.com/swift/blog/?id=25

于 2015-06-23T11:56:12.733 回答
10

nonnull是一个关键字,告诉编译器返回值(或参数或属性)永远不会为零。这是在以前版本的 Xcode 中引入的,以实现 Obj-C 和 Swift 的可选类型之间更好的互操作性。

您可以在Swift 官方博客上了解更多信息

于 2015-06-23T11:53:35.080 回答
4

nonnullis 关键字通知编译器对象/参数返回的值永远不会是nil.

一般来说,您应该大致按照您当前使用断言或异常的方式查看可空和非空:违反合同是程序员错误。特别是,返回值是您可以控制的,因此您永远不应该为不可为空的返回类型返回 nil,除非它是为了向后兼容。

于 2015-06-23T13:22:36.740 回答
0

引入了 nullable 和 nonnull 以使 Objective C 和 Swift 的互操作性更容易。

Objective C 在可选引用和非可选引用之间没有任何区别。然后 Swift 编译器无法确定对 Objective C 代码的特定引用是否是可选的。

可空注释与 Swift 中的可选注释相同。nonnull 注释与 Swift 中的 non-optional 相同。

经验法则是任何简单的指针类型都将被假定为非空(有关更多详细信息,请阅读官方 Swift 博客

我还要说,从 Objective C 的角度来看,这个新注释也将提高代码质量。我通常想知道如果将 nil 作为参数传递,应用程序会崩溃吗?例如:

id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];

在这种情况下,编译器什么也没说,您的应用程序将在执行时崩溃!现在有了这个新注释,您将在编译时看到警告。我知道这个例子很愚蠢,但是在某些情况下,除非您阅读文档,否则您不知道是否需要在调用方法之前检查属性是否为 nil。

于 2015-06-23T12:37:14.390 回答