OC 30 day
我在swift讀書會上發起了這個疑問,得到非常多人的解惑,因此發起這篇文章。
func method(a:String?)
這段程式碼的意思就是說,a 這個參數是可以為nil的,他可以存在也可以不存在。
這段語法究竟是能在Objective-C上實現的嗎?
可以的,如以下的程式碼就是
- (void)method:(nullable NSString *)a;
我們在宣告type的地方加上標記,nullable nonull都是標記是否能nil。如字面上的意思做以下解釋。
可以是null的
不可以null
值得注意的是,Objective-C 的語法語swift 是不同的。
因為 Objective-C null 檢查是不嚴謹的,在語言特性有很大的彈性同時,需要做的處理自然就會變多,這就是動態語言的特性了。
那麼,如果method 沒有nil有處理,如果又給了nil 是不是就carsh了?
沒錯的...
Objective-C 在swift 出來之前,method 的參數是否能 nil 都是要去查文件才能知道,nullable 與 nonull 在method描述上就能知道是否能給nil了。
另外語法特性的差異還有下面這點:
宣告時:
func method(a:String,b:String?){
}
呼叫時
method(a:str)
我們可以看到,因為參數b 我們不給他值,那麼我們可以直接忽略他,在Objective-C上有類似的語法嗎?
宣告時
- (void)method:(NSString *)a :(nullable NSString *)b{
}
呼叫時
[self method:str :nil];
以上的語法證實,沒辦法省略。儘管你沒有要給a 這個參數,你勢必還是要給 nil。
難道,就真的沒辦法省略嗎?還是可以的
宣告時
- (void)method:(NSString *)a :(NSString *)b{
}
- (void)method:(NSString *)a{
}
呼叫時
[self method:str];
用以上語法,可以實踐出省略的效果,但是我們要注意的是,他的本質意義上是與不給值而省略不同。在 method 的參數上無論做了nullable描述,都必須要自行 nil 處理。