2017年11月1日 星期三

[Objective-C] Nullability

Swift有提供可選型別(Optional)來判斷該值是否能為null,而Objective-C並沒有這樣的設計,因此Xcode增加了Nullability Annotations的機制,也就是NullableNonnull

Nullable - 表示對象可為null
Nonnull - 表示對象不可為null

而一開始增加此機制時,所提供的關鍵字為__nullable/__nonnull,但是為了處理與第三方套件的衝突,蘋果又將此關鍵字改為_Nullable/_Nonnull,以及沒有底線版本的nonnull/nullable,基本上這三種東西都是同樣的效果,只是放的位置不同而已。

小寫版本的__nullable/__nonnull,應該比較少用了,絕大部分還使用_Nullable/_Nonnull與沒有底線的nonnull/nullable

那麼有底線跟沒底線的是什麼情景會用到呢,可以參考以下的程式碼


有底線的則是用於Block內傳入的參數或回傳的參數。


接著你只要在呼叫的時候傳入nil,Xcode就會發出警告。


不過若是每個都要設定成不能Nonnull實在有點麻煩,因此有提供Macro,只要輸入NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END,在這個區塊內所有的東西就會自動判定為Nonnull,你只需要定義出屬於Nullable的值即可。



接著你可以試著看一下是否有作用。