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 更新后,也需要注意下这个问题~