iOS APP 开发 OC 第二十四天,funtion 参数是否可以nil?

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 处理。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章