Использование списка в будущем, такого как [weak delegate] in
, приведет к копированию значения делегата в тот момент, когда закрытие инициализируется.Поэтому, если в этот момент делегат равен nil
, если if останется nil
внутри замыкания, не важно, измените ли вы self.delegate
в более позднее время.Это также верно для [weak self]
, с небольшим исключением, что self
обычно не изменяется в Swift.
Проверьте этот пример:
class Delegate {
}
class A {
var delegate:Delegate?
func foo() {
print ("in foo ---------------------")
delegate = nil
print ("delegate before: \(delegate)") // prints: "nil"
var closure = { print ("in closure: \(self.delegate)")}
closure() // prints: "in closure: nil"
delegate = Delegate()
print ("delegate after: \(delegate)") // prints "Optional(SwiftPlayground.Delegate)"
closure() // prints "in closure: Optional(SwiftPlayground.Delegate)"
}
func bar() {
print ("in bar ---------------------")
delegate = nil // prints "nil"
print ("delegate before: \(delegate)")
var closure = { [weak delegate] in print ("in closure: \(delegate)")}
closure() // prints: "in closure: nil"
delegate = Delegate() // prints "Optional(SwiftPlayground.Delegate)"
print ("delegate after: \(delegate)")
closure() // prints "nil"
}
}
let a = A()
a.foo()
a.bar()
Здесь самый последний closure()
вызов func bar
напечатает nil
, потому что delegate
был nil
во время инициализации closure
.