nonull nullable

在swift中,我们使用 !? 来表示一个对象是 optionalnon-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表示对象不应该为空。当我们不遵循这一规则时,编译器就会给出警告。

我们来看看以下的实例:

《nonull nullable》 Paste_Image.png

当我传入的参数有 nonnull修饰时,说明参数不能为nil,否则编译器就会报警告

《nonull nullable》 Paste_Image.png

当属性用nonnull修饰时,说明该属性不能为nil,否则编译器就会报警告

如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事,怎么办呢?

《nonull nullable》 Paste_Image.png

苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。如下代码所示:

《nonull nullable》 Paste_Image.png

在这两个宏之间的都是 nonnull 类型的,不能直接设置为nil

    原文作者:小明的知识库
    原文地址: https://www.jianshu.com/p/391978ad12ab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞