To ma sens, aby nie zaktualizować zmienną success
, ponieważ parametr inout
jest parametrem foo
, a nie samym zamknięciem. Można uzyskać pożądane zachowanie Jeśli się parametr inout
parametr zamknięcia:
var success = false
let closure = { (inout flag: Bool) ->() in
flag = true
print(flag)
}
closure(&success) //prints "true"
print(success) //prints "true"
Wzór ten również działa z funkcją też, tak długo, jak zachować parametr inout
parametr zamknięcia:
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"
również uzyskać pożądane zachowanie, jeśli używasz typ referencyjny:
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"
Dlaczego kopii w tle? Czy to jest płytka kopia? –
"Cień" w tym sensie, że jest ukryty. –