Swift 3.0 浅析 - 函数的参数中不再使用 var 关键字



- 作者: SwiftCafe


我们继续再来探讨 Swift 3 带来的改变,这次是关于 var 关键字的,函数的参数不能再使用 var 作为修饰关键字了。

还是回到 Swift 3 的提案主页上,会看到一个叫做 SE-0003 的提案,是苹果工程师 David Farler 发起的。这个提案的内容原文如下:

There has been some confusion of semantics when a function parameter is marked as inout compared to var. Both give a mutable local copy of a value but parameters marked inout are automatically written back.

简单来说,对于函数参数,var 和 inout 修饰方法会产生很多语义上的混淆。虽然这两者都可以让这个参数变成可修改的。但只有 inout 方式才能让这个参数修改后真正的写回原始地址中。咱们来看一个例子就明白啦:

1
2
3
func handle(var x: Int) {
x = 2
}

这里我们定义了一个 handle 函数,在这个函数中修改了他的参数 x。 定义好之后,我们来调用它:

1
2
3
var param = 1
handle(param)
print(param) // 1

你会发现,虽然 handle 函数内部对参数进行了重新赋值,但我们调用后, param 变量的值还是 1。

我们再来看另外一种定义方式:

1
2
3
func handle(inout x: Int) {
x = 2
}

这次 handle 函数的定义几乎和我们之前的一样,唯一的不同就是参数前面的 var 换成了 inout,然后我们再调用这个函数:

1
2
3
var param = 1
handle(&param)
print(param) // 2

这次 param 输出的结果就是 2 了。

可见这两个关键字在函数参数的定义上面,确实容易造成混淆。 所以在 Swift 3 之后, var 定义参数的方式就被取消了。 如果现在你使用的是 Swift 2.2 编译器,使用 var 关键字就会产生一个编译警告。而等到了 Swift 3 正式发布之后,就会直接产生编译错误了。

所以如果大家的 Swift 项目中有过这样的引用,那么现在就应该注意修改了。

如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。




微信公众平台
更多精彩内容,请关注微信公众号


公众号:swift-cafe
邮件订阅
请输入您的邮箱,我们会把最新的内容推送给您: