考虑以下代码:
func foo(inout success: Bool) -> (()->()) {
return { _ in
success = true
print (success)
}
}
var success = false
let closure = foo(&success)
closure() //prints "true"
print(success) //prints "false"
闭包似乎是创建成功的副本,并没有改变原来的。为什么会这样?我曾假设闭包会指向原始闭包,因为我们正在传递一个 inout
变量。
最佳答案
这不会更新您的 success
变量是有道理的,因为您的 inout
参数是 foo
的参数,而不是闭包的参数本身。如果将 inout
参数作为闭包的参数,您将获得所需的行为:
var success = false
let closure = { (inout flag: Bool) -> () in
flag = true
print(flag)
}
closure(&success) //prints "true"
print(success) //prints "true"
只要您将 inout
参数作为闭包的参数,此模式也适用于该函数:
func foo() -> ((inout Bool)->()) {
return { flag in
flag = true
print (flag)
}
}
var success = false
let closure = foo()
closure(&success) //prints "true"
print(success) //prints "true"
如果您使用引用类型,您还会获得所需的行为:
class BooleanClass: CustomStringConvertible {
var value: Bool
init(value: Bool) {
self.value = value
}
var description: String { return "\(value)" }
}
func foo(flag: BooleanClass) -> (()->()) {
return {
flag.value = true
print (flag)
}
}
let success = BooleanClass(value: false)
let closure = foo(success)
closure() //prints "true"
print(success) //prints "true"
关于Swift 闭包捕获和 inout 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851616/