2015-06-23 76 views

回答

16

他们已确保无论类型是不是空的,现在是一个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

9

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

您可以了解更多关于它的the official Swift blog

+6

你的意思是“永远不会*故意*为零”。 –

+1

它可能是零,但是无论如何,你的应用程序在DS中,并且超出希望。我想知道是否有人尝试了将_do_赋给Swift对象引用的nil时发生了什么。 – gnasher729

+2

@ gnasher729 - 根据我在这里看到的问题,人们经常尝试。 –

0

可空非空并已引入使目标C和斯威夫特互操作性更为容易。

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

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

经验法则是任何简单的指针类型将被假定为一个非空(详情阅读the official Swift blog

我还要说,这种新的注释也将改善但从目标C点代码质量。我通常不知道应用程序崩溃,如果通过零参数?例如:

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

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

+1

在你的例子中,我认为重要的是要注意,由于NSMutableArray引发异常,应用程序只会崩溃。对象参数被注释为nonnull的事实不会导致应用程序崩溃,但有一个例外(不幸的是)。我倾向于在我的公共方法中验证我的输入为零,并且抛出我自己的描述性例外,而不是稍后因为难以诊断的原因而崩溃。 –

3

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

一般情况下,你应该看看可空非空和粗略的方式 您目前使用的断言或例外:违反合同 编程错误。特别是,返回值是您控制的东西,因此除非为了向后兼容,否则不应返回nil作为不可为空的返回类型 。