目标C中什么是非空的?
有人可以详细说明为什么在iOS 9中引入nonnull
?
例如, NSArray
方法+ (instancetype)array;
现在是+ (instancetype nonnull)array;
参考: https : //developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html
这是一个客观的C级function,这将如何影响现有的应用程序?
他们确信,无论哪种types都不可空,它现在是一个nonnull
空types。
像之前的NSMutableArray addObject
方法一样
- (void)addObject:(ObjectType)anObject
现在已经改成了
- (void)addObject:(ObjectType nonnull)anObject
所以这意味着你不能传递一个null对象( nil
)给这个方法。 同样的方式,在你的情况
+ (instancetype nonnull) array
方法将永远不会返回nil
。
参考: https : //developer.apple.com/swift/blog/?id = 25
nonnull
是一个关键字,告诉编译器返回值(或参数或属性)永远不会是零。 这是在以前版本的Xcode中引入的,以便在Obj-C和Swift的可选types之间实现更好的交互性。
你可以在官方的Swift博客上了解更多
nonnull
是关键字,通知编译器由对象/参数返回的值永远不会nil
。
一般来说,你应该大体上看你可以使用断言或exception的方式为空和非空:违反合同是程序员的错误。 特别的,返回值是你控制的东西,所以你不应该为非空的返回types返回nil,除非它是为了向后兼容的。
已经引入可空和非空来使Objective C和Swift的互操作性更容易。
Objective C在可选引用和非可选引用之间没有任何区别。 然后Swift编译器不能确定是否对Objective C代码的特定引用是可选的。
可空注释与Swift中的可选注释相同。 在Swift中,nonnull注释和non-optional是一样的。
经验法则是任何简单的指针types将被假定为非空(更多细节请阅读官方的Swift博客 )
我也会说,这个新的注释也将从Objective C的angular度来提高代码质量。 我通常不知道应用程序崩溃,如果通过零参数? 例如:
id var; NSMutableArray *a = [NSMutableArray new]; [a addObject:var];
编译器在这种情况下不会说任何东西,你的应用程序会在执行时崩溃! 现在有了这个新的注释,你将在编译时看到一个警告。 我知道这个例子是愚蠢的,但是有些情况下,除非你阅读文档,否则在调用方法之前,你不知道是否需要检查一个属性是否为零。