2017-10-06 1 views
1

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?

+1

Vergleichen https://stackoverflow.com/q/43171341/2976878 – Hamish

+1

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

+0

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

Antwort

0

Verschlüsse in Swift erfassen alle Variablen durch Referenz, genau wie Variablen, die als __block deklariert sind, von Blöcken in Objective-C erfasst werden. Daher werden Änderungen an der Variablen außerhalb des Abschlusses nach dem Erstellen des Abschlusses immer noch im Abschluss angezeigt, wenn es ausgeführt wird.

Verwandte Themen