Swift 和 inout 参数中闭包的变量捕获

2024-05-22

我注意到,当 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(使用前将#替换为@)

Swift 和 inout 参数中闭包的变量捕获 的相关文章

随机推荐