为什么在下面的代码中“ someVariable”变量的值没有变化

时间:2019-08-26 05:48:47

标签: swift closures

我只是在操场上尝试一些代码,而我遇到了这种情况。我无法理解为什么以下代码中的someVariable的值未更新。有人可以解释一下我的行为吗?

var someVariable = "something"
let closure = { [someVariable] in
    print("This is \(someVariable)")
}
someVariable = "otherVariable"
closure()

顺便说一句,代码的输出为This is something

3 个答案:

答案 0 :(得分:0)

您的closure在初始化时确实捕获了参考变量someVariable。初始化后所有更改都不会影响。

答案 1 :(得分:0)

因为您在初始点传递了它,并且String传递了它们的值,不是它们的引用。因此,编译器通过它后,就会立即将其与当前值(逻辑上)一起复制。 More information about this behavior here

最后,将其更改为此,您将很高兴:

var someVariable = "something"
let closure: (String)->() = { someVariable in
    print("This is \(someVariable)")
}
someVariable = "otherVariable"

closure(someVariable)

答案 2 :(得分:0)

closure在声明时捕获要在闭包内部使用的对象。当 Value struct)类型或 Reference class)类型的对象被闭包捕获时,其行为将有所不同。

例如,在您的情况下,someVariable(即String)是Value类型,因此一旦被闭包捕获,它将保留实际值的副本这个变量。当您为someVariable分配新值时,闭包内的副本将不会更改。

但是,如果您在Reference内捕获closure类型的对象,则它将retainreference的{​​{1}}上,对该对象的任何更改都将反映在封闭内部。参见下面的示例,

object