目标 C 中什么是非空?

问题描述 投票:0回答:4

有人可以详细说明为什么在 iOS 9 中引入

nonnull
吗?

例如,

NSArray
方法
+ (instancetype)array;
现在是
+ (instancetype nonnull)array;

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

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

ios objective-c initialization xcode7 ios9
4个回答
22
投票

他们确保只要类型不可为空,它现在都是

nonnull
类型。

就像之前的

NSMutableArray addObject
方法是

- (void)addObject:(ObjectType)anObject  

现在已更改为

- (void)addObject:(ObjectType nonnull)anObject

所以这意味着你不能将空对象(

nil
)传递给这个方法。同样的方式,在你的情况下

+ (nonnull instancetype) array

方法永远不会返回

nil

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


11
投票

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

您可以在官方 Swift 博客

了解更多信息

6
投票

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

一般来说,你应该大致这样看待 nullable 和 nonnull 您当前使用断言或异常:违反合同是 程序员错误。特别是,返回值是您所需要的 控制,所以你不应该为不可为空的返回类型返回 nil 除非是为了向后兼容。


0
投票

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

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

可空注释与 Swift 中的可选注释相同。 非空注释与 Swift 中的非可选注释相同。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.