inout 关键字位置的变化

inout 关键字可以用于将参数修饰为可修改,并且将修改会回传。这次 Swift 3 中对这个关键字也做了一些修改,咱们一起来聊聊吧。

在 Swift 中,如果我们希望一个函数可以修改它的参数变量的值,我们可以使用 inout 关键词。这个相当于编程语言概念中所谓的传址调用。 具体代码中就是这样的例子:

func foo(inout x:  Int) {

    x = 2

}

var x = 5
foo(&x)
print(x) // 2

在这个例子中, foo 函数的参数 x, 使用了 inout 修饰,这样我们在后面的调用中,将变量 x 传递给这个函数后,这个变量中的值也会被这个函数内部改变。 这个就是 inout 的基本作用了。

在 Swift 3.0 中,有一个 SE-0031 的提案,就是改变 inout 这个关键词的位置的。

当前的语法中,inout 的位置是在参数标签的位置上,也就是这个例子中的:

func foo(inout x:  Int)

inout 关键字位于参数标签 x 的前面。 而 Swift 3.0 以后,这个关键词的位置就会在参数类型前面了:

func foo(x: inout Int)

这个提案中也解释了这样做的好处。首先这样做之后参数标签就不和修饰关键字发生混淆,比如避免了这样的情况:

func foo(inOut x:  Int)
func foo(inout x:  Int)

第一行的 inout 的大小写错误,所以它不是关键字。但这时编译器不会报错,因为 inOut 这时候作为了外部参数标签(Swift 的参数标签分为外部标签和内部标签,这个例子中外部标签是 inOut,所以我们在外部调用这个函数的时候就是这个语法 foo(inOut:),而函数内部还是用内部标签 x 来引用这个参数)。

除了避免混淆之外,inout 的位置移动后还有一点需要大家注意的。按照提案中的意思,就是以前版本的遗留代码中的 inout,很可能会变成参数标签,也就是这样:

func foo(inout x:  Int)

比如之前我们的 foo 函数这样定义,但 Swift 3.0 之后, 这里的 inout 并不是关键字,而变成这个参数的外部标签了。所以这一点还是很值得注意的。

最后提案中还说了一句,这样修改后能够更好的和 Rust 语言的模式相匹配。并且说在后续的版本中会更多的引入到 Swift 语言中。

总体来说呢,这个改动不算大,但多多少少会对我们已有的代码造成一些影响。 inout 这个关键字大家应该多少都会用到过。所以在 Swift 3.0 更新后,也需要注意下这个问题~

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy