2016-06-21 12 views
2

Die Beschreibung der Verschlüsse swift office documentWie funktioniert Verschluss speichern Verweise auf Konstanten oder Werte

kommt

erfassen kann und Speicher verweist auf beliebige Konstanten und Variablen aus dem Kontext, in dem sie definiert sind. Dies wird als Schließen dieser Konstanten und Variablen bezeichnet.

Ich verstehe nicht vollständig speichern Referenzen Teil. Bedeutet es, dass es eine Art "Zeiger" auf eine Variable erzeugt? Wenn der Wert geändert wurde, hat sich der "de-referenzierte Zeiger" ebenfalls auf den neuen Wert geändert. Ich denke Swift hat kein Zeigerkonzept. Ich habe es ausgeliehen, um mein Verständnis auszudrücken.

Wäre sehr schön, dass jemand eine einfache Codezeilen zur Verfügung stellen kann, um zu erklären, wie die Schließung Referenz auf die Konstanten/Variablen speichert.

+1

Wenn Sie diesen Abschnitt im Swift-Sprachführer weiterlesen, sehen Sie, dass sie ein Beispiel einer 'makeIncrementer'-Funktion zeigen und erklären, die zeigt, wie Verschlüsse Werte als Referenzen erfassen. Die 'runningTotal' -Variable wird als Referenz erfasst, so dass mehrere Aufrufe der zurückgegebenen Funktion (die das' runningTotal' erfasst) inkrementiert werden, da sie einen Verweis auf diese Variable enthält - obwohl es ein Werttyp ist. – Hamish

+2

Beachten Sie, dass selbst wenn Swift als Sprache keine Zeiger enthielt (JavaScript hat beispielsweise Closures, aber keine Raw-Memory-Pointer), dies keinen Einfluss auf die Assembly hat, die der Swift-Compiler ausgibt. Es wird viele indirekte Verweise ("Zeiger") im Assemblercode geben. Viele Dinge, die in "Swift" illegal sind, sind in der swiftc-Ausgabe völlig legal (ungebundene gotos zum Beispiel sind in der Compiler-Ausgabe üblich, aber existieren in der Sprache nicht). –

Antwort

3

Bedeutet es, dass es eine Art "Zeiger" für eine Variable erzeugt? Wenn der Wert geändert wurde, änderte sich der "de-referenzierte Zeiger" ebenfalls in den neuen Wert .

Ja.

Ich denke Swift hat kein Zeiger-Konzept.

Es sicherlich nicht, in der (impliziten) Form von Referenztypen (Klassen) und der (expliziten) Form UnsafePointer

Hier ist ein Beispiel für eine Variable, in einem Verschluss erfaßt. Dies alles ist zufällig single-threaded, aber Sie könnten diese Schließung von großen zentralen Versand gesendet werden. x wird erfasst, so dass es für die gesamte Lebensdauer des Verschlusses existiert, selbst wenn der Verschluss existiert, nachdem x deklariert wird (f()).

func f() { 
    var x = 0 //captured variable 

    _ = { 
     x = 5 //captures x from parent scope, and modifies it 
    }() 

    print(x) //prints 5, as x was modified by the closure 
} 

f() 

Ich schrieb another answer, die die Beziehungen zwischen den Funktionen, Verschlüssen und anderen Begriffen erklärt. Es ist lesenswert, IMO.

+0

Vielen Dank für den Beispielcode und die Ressource für das weitere Studium ") – SLN

Verwandte Themen