在swift中联贩,我們使用 ! 和 ? 來(lái)表示一個(gè)對(duì)象是 optional 和 non-optional, 例如:
view? 和 view!
但是在swift與Objective-c混編時(shí)蝙搔,swift編譯器并不知道objective-c對(duì)象到底是optional還是non-optional,因?yàn)檫@種情況下編譯器會(huì)隱式地將object-c對(duì)象當(dāng)成是 non-optional
為了解決這個(gè)問(wèn)題,蘋(píng)果在Xcode 6.3引入了一個(gè)Objective-C的新特性:nullability annotations穆壕。這一新特性的核心是兩個(gè)新的類型注釋:__nullable和__nonnull。
從字面上我們可以猜到其屏,__nullable表示對(duì)象可以是NULL或nil粱檀,而__nonnull表示對(duì)象不應(yīng)該為空。當(dāng)我們不遵循這一規(guī)則時(shí)漫玄,編譯器就會(huì)給出警告茄蚯。
我們來(lái)看看以下的實(shí)例:
當(dāng)我傳入的參數(shù)有 nonnull修飾時(shí),說(shuō)明參數(shù)不能為nil,否則編譯器就會(huì)報(bào)警告
當(dāng)屬性用nonnull修飾時(shí)睦优,說(shuō)明該屬性不能為nil,否則編譯器就會(huì)報(bào)警告
如果需要每個(gè)屬性或每個(gè)方法都去指定nonnull和nullable渗常,是一件非常繁瑣的事,怎么辦呢汗盘?
蘋(píng)果為了減輕我們的工作量皱碘,專門(mén)提供了兩個(gè)宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。在這兩個(gè)宏之間的代碼隐孽,所有簡(jiǎn)單指針對(duì)象都被假定為nonnull癌椿,因此我們只需要去指定那些nullable的指針。如下代碼所示:
在這兩個(gè)宏之間的都是 nonnull 類型的菱阵,不能直接設(shè)置為nil