Ich versuche herauszufinden, wie das Capturen in Swift-Verschlüssen funktioniert.Wie erfassen Verschlüsse in Swift Variablen unter der Haube?
Lassen sich das folgende Codebeispiel
class Worker {
let block:() -> Void
let id: String
init(id: String, block: @escaping () -> Void) {
self.id = id
self.block = block
}
}
var worker: Worker!
worker = Worker(id: "1", block: { _ in
print(worker.id)
})
Im Moment übernimmt die Schließung erstellt wird, die Arbeiter Variable noch null ist. Die Schließung wird jedoch die Worker-Variable erfolgreich erfassen.
Wie funktioniert das? Wie behält die Schließung einen starken Bezug auf eine Variable, die noch nicht initialisiert wird?
Vergleichen https://stackoverflow.com/q/43171341/2976878 – Hamish
Beachten Sie, dass 'worker' * in Ihrem Beispiel * initialisiert ist, es wird implizit mit' nil' initialisiert (und dann * weisen Sie ihm einen Verweis zu eine neue "Worker" -Instanz). – Hamish
Der Arbeiter ist tatsächlich initialisiert, aber zu einem späteren Zeitpunkt. Im Moment der Schließung ist der Arbeiter immer noch gleich Null. – itskoBits