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


<<:  Day 03:转吧转吧七彩霓虹灯之 p10k

>>:  Windows Server 安装 MySQL Community 免费社群版

Day29: Picker controller

前言 今天要在 RecipeDetailView 中添加 Picker controller, 使其...

Day11 天气API小实作1

因为这次我接的API是openweather,所以我们开始前要先到他们的官网去申请帐号哦! 注册完後...

Webview问题集(下)-常用功能

缘由: APP开发使用Webview也是很常见的,有些功能常用但难度不高,有些功能则需要与网页端配合...

【Day 4】DevOps x Containerized x 王大陆都知道的容器化好处

tags: 铁人赛 Docker Container Microservice DevOps 概述 ...

Day21 - Blocking & Non-blocking Mode

tags: 2021永丰金铁人赛 当程序要在很短的时间内发送好几笔委托单,就会牵涉到blocking...