我只是在操场上尝试一些代码,而我遇到了这种情况。我无法理解为什么以下代码中的someVariable
的值未更新。有人可以解释一下我的行为吗?
var someVariable = "something"
let closure = { [someVariable] in
print("This is \(someVariable)")
}
someVariable = "otherVariable"
closure()
顺便说一句,代码的输出为This is something
答案 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
类型的对象,则它将retain
到reference
的{{1}}上,对该对象的任何更改都将反映在封闭内部。参见下面的示例,
object