tags: OC 30 day
我在swift读书会上发起了这个疑问,得到非常多人的解惑,因此发起这篇文章。
写swift 时,会很常用到这样的语法:
func method(a:String?)
这段程式码的意思就是说,a 这个参数是可以为nil的,他可以存在也可以不存在。
这段语法究竟是能在Objective-C上实现的吗?
可以的,如以下的程式码就是
Objective-C 的可选语法
- (void)method:(nullable NSString *)a;
我们在宣告type的地方加上标记,nullable nonull都是标记是否能nil。如字面上的意思做以下解释。
nullable
可以是null的
nonull
不可以null
值得注意的是,Objective-C 的语法语swift 是不同的。
1. nonull仅仅是在compile时帮你检查而已,动态没处理一样Crash。
因为 Objective-C null 检查是不严谨的,在语言特性有很大的弹性同时,需要做的处理自然就会变多,这就是动态语言的特性了。
那么,如果method 没有nil有处理,如果又给了nil 是不是就carsh了?
没错的...
2. nullable 与仅有标籤的意义,实质上是没有任何处理的。
Objective-C 在swift 出来之前,method 的参数是否能 nil 都是要去查文件才能知道,nullable 与 nonull 在method描述上就能知道是否能给nil了。
另外语法特性的差异还有下面这点:
参数在呼叫时,不能省略
在swift的语法,可以透过以下语法让参数可以省略:
宣告时:
func method(a:String,b:String?){}
呼叫时
method(a:str)
我们可以看到,因为参数b 我们不给他值,那么我们可以直接忽略他,在Objective-C上有类似的语法吗?
在 Objective-C 的语法:
宣告时
- (void)method:(NSString *)a :(nullable NSString *)b{}
呼叫时
[self method:str :nil];
以上的语法证实,没办法省略。儘管你没有要给a 这个参数,你势必还是要给 nil。
难道,就真的没办法省略吗?还是可以的
利用 overload 的特性实践,不同的参数需求
宣告时
- (void)method:(NSString *)a :(NSString *)b{}- (void)method:(NSString *)a{}
呼叫时
[self method:str];
总结
用以上语法,可以实践出省略的效果,但是我们要注意的是,他的本质意义上是与不给值而省略不同。在 method 的参数上无论做了nullable描述,都必须要自行 nil 处理。