有人可以详细说明为什么在iOS 9中引入了nonnull
?目标C中什么是非空?
例如,NSArray
方法+ (instancetype)array;
现在+ (instancetype nonnull)array;
这是一个Objective-C级别的功能,以及如何将这种影响现有的应用程序?
有人可以详细说明为什么在iOS 9中引入了nonnull
?目标C中什么是非空?
例如,NSArray
方法+ (instancetype)array;
现在+ (instancetype nonnull)array;
这是一个Objective-C级别的功能,以及如何将这种影响现有的应用程序?
他们已确保无论类型是不是空的,现在是一个nonnull
类型。
与早期NSMutableArray addObject
方法是
- (void)addObject:(ObjectType)anObject
,现在它已被更改为
- (void)addObject:(ObjectType nonnull)anObject
因此,这意味着你不能传递一个空对象(nil
)这一方法。相同的方式,在你的情况下
+ (instancetype nonnull) array
方法将永远不会返回nil
。
nonnull
是一个关键字,告诉编译器返回值(或参数或属性)永远不会为零。这是在先前版本的Xcode中引入的,以便在Obj-C和Swift的可选类型之间实现更好的互操作性。
您可以了解更多关于它的the official Swift blog
可空非空并已引入使目标C和斯威夫特互操作性更为容易。
Objective C在可选和非可选引用之间没有任何区别。那么Swift编译器无法确定对Objective C代码的特定引用是否可选。
可为空的注释与Swift中的可选注释相同。 非空注释与Swift中的非可选注释相同。
经验法则是任何简单的指针类型将被假定为一个非空(详情阅读the official Swift blog)
我还要说,这种新的注释也将改善但从目标C点代码质量。我通常不知道应用程序崩溃,如果通过零参数?例如:
id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];
在这种情况下,编译器不会说任何事情,并且您的应用程序将在执行时崩溃!现在有了这个新的注释,您将在编译时看到警告。我知道这个例子很愚蠢,但有些情况下,如果除非您阅读文档,否则在调用方法之前您是否需要检查属性是否为零。
在你的例子中,我认为重要的是要注意,由于NSMutableArray引发异常,应用程序只会崩溃。对象参数被注释为nonnull的事实不会导致应用程序崩溃,但有一个例外(不幸的是)。我倾向于在我的公共方法中验证我的输入为零,并且抛出我自己的描述性例外,而不是稍后因为难以诊断的原因而崩溃。 –
nonnull
是关键字,它通知编译器由对象/参数返回的值永远不会是nil
。
一般情况下,你应该看看可空非空和粗略的方式 您目前使用的断言或例外:违反合同 编程错误。特别是,返回值是您控制的东西,因此除非为了向后兼容,否则不应返回nil作为不可为空的返回类型 。
你的意思是“永远不会*故意*为零”。 –
它可能是零,但是无论如何,你的应用程序在DS中,并且超出希望。我想知道是否有人尝试了将_do_赋给Swift对象引用的nil时发生了什么。 – gnasher729
@ gnasher729 - 根据我在这里看到的问题,人们经常尝试。 –