在swift中,我们使用 ! 和 ? 来表示一个对象是 optional 和 non-optional, 例如:
view? 和 view!
但是在swift与Objective-c混编时,swift编译器并不知道objective-c对象到底是optional还是non-optional,因为这种情况下编译器会隐式地将object-c对象当成是 non-optional
为了解决这个问题,苹果在Xcode 6.3引入了一个Objective-C的新特性:nullability annotations。这一新特性的核心是两个新的类型注释:__nullable和__nonnull。
从字面上我们可以猜到,__nullable表示对象可以是NULL或nil,而__nonnull表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。
我们来看看以下的实例:
当我传入的参数有 nonnull修饰时,说明参数不能为nil,否则编译器就会报警告
当属性用nonnull修饰时,说明该属性不能为nil,否则编译器就会报警告
如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事,怎么办呢?
苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。如下代码所示:
在这两个宏之间的都是 nonnull 类型的,不能直接设置为nil