我注意到,当 Swift 中的闭包捕获变量时,闭包实际上可以修改该值。这对我来说似乎很疯狂,也是一种获得可怕错误的绝佳方法,特别是当同一个 var 被多个闭包捕获时。
var capture = "Hello captured"
func g(){
// this shouldn't be possible!
capture = capture + "!"
}
g()
capture
另一方面,有 inout 参数,它允许函数或闭包修改其参数。
还需要 inout 有什么用,甚至捕获的变量也已经可以不受惩罚地修改了??!!
只是想了解这背后的设计决策......
从外部作用域捕获的变量不是例程的参数,因此它们的可变性是从上下文继承的。默认情况下,例程的实际参数是常量(let),因此不能在本地修改(并且不返回它们的值)
另请注意,您的示例并未真正捕获capture
因为它是一个全局变量。
var global = "Global"
func function(nonmutable:Int, var mutable:Int, inout returnable:Int) -> Void {
// global can be modified here because it's a global (not captured!)
global = "Global 2"
// nomutable can't be modified
// nonmutable = 3
// mutable can be modified, but it's caller won't see the change
mutable = 4
// returnable can be modified, and it's caller sees the change
returnable = 5
}
var nonmutable = 1
var mutable = 2
var output = 3
function(nonmutable, mutable, &output)
println("nonmutable = \(nonmutable)")
println("mutable = \(mutable)")
println("output = \(output)")
另外,正如您所看到的,inout 参数的传递方式不同,因此很明显,返回时,值可能不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)