[Swift] Erfassungsliste

Was ist das für ein Beitrag?

Dies ist eine Originalübersetzung von Official Document Contents für die Erfassungsliste in der Swift-Programmierung.

Umgebung

macOS 10.15.7 Xcode 12.1 Swift 5.3

Was ist eine Erfassungsliste?

Standardmäßig erfasst der Abschlussausdruck "Konstanten und Variablen im umgebenden Bereich" mit einer ** starken Referenz **. In der Erfassungsliste können Sie explizit steuern, wie der Abschluss den Wert erfasst.

Die Erfassungsliste wird als "durch Kommas getrennte Liste in eckigen Klammern" vor der Liste der Parameter beschrieben. Verwenden Sie bei Verwendung einer Erfassungsliste immer das Schlüsselwort "in", auch wenn Sie den Parameternamen, den Parameter und die Rückgabetypen weglassen.

{ [value1, value2, ...] in STATEMENT }

Die Einträge in der Erfassungsliste werden beim Erstellen des Abschlusses initialisiert. Die Konstanten für jeden Eintrag in der Erfassungsliste werden mit dem Wert "Konstanten oder Variablen mit demselben Namen im umgebenden Bereich" initialisiert. Im folgenden Code ist beispielsweise "a" in der Erfassungsliste enthalten, "b" jedoch nicht.

python


var a = 0
var b = 0
let closure = { [a] in    //a wird mit 0 initialisiert
    print(a, b)           //Das Ändern eines Bereichs außerhalb des Bereichs hat keine Auswirkung
}

a = 10                    //Diese Änderung wirkt sich nicht auf a in der Erfassungsliste aus
b = 10
closure()
// Prints "0 10"

Der In-Scope "a" wird beim Erstellen des Abschlusses mit dem "Out-of-Scope" a "-Wert initialisiert, aber diese Werte sind nicht speziell verbunden. Das heißt, das Ändern eines außerhalb des Geltungsbereichs liegenden "a" wirkt sich nicht auf ein in den Geltungsbereich gerichtetes "a" aus, und das Ändern eines geschlossenen "a" wirkt sich nicht auf ein außerhalb des Geltungsbereichs liegendes "a" aus. Im Gegensatz dazu gibt es nur eine Variable mit dem Namen "b" außerhalb des Gültigkeitsbereichs, sodass sich Änderungen sowohl innerhalb als auch außerhalb des Verschlusses auswirken.

Diese Unterscheidung wird jedoch nicht getroffen, wenn die erfasste Variable "Referenztypdaten" war. Im folgenden Code gibt es beispielsweise zwei "x" in "Out-of-Scope-Variablen" und "In-Scope-Konstanten", aber beide beziehen sich auf dasselbe Objekt, da es sich um Referenztypdaten handelt.

python


class SimpleClass {
    var value: Int = 0
}
var x = SimpleClass()          //Erste Variable x (x.Wert wird mit 0 initialisiert)
var y = SimpleClass()
let closure = { [x] in         //Die zweite Konstante x (x).Wert wird mit 0 initialisiert)
    print(x.value, y.value)    //Das Ändern von x außerhalb des Bereichs hat Auswirkungen
}

x.value = 10                   //Änderungen außerhalb des Gültigkeitsbereichs wirken sich auch auf x in der Erfassungsliste aus
y.value = 10
closure()
// Prints "10 10"

Wenn der Werttyp des Ausdrucks eine Klasse ist, können Sie den Ausdruck in der Erfassungsliste mit "schwach" markieren, um einen "schwachen Verweis" auf den Wert des Ausdrucks zu erfassen. Sie können einen Ausdruck in der Erfassungsliste auch mit "nicht besessen" markieren, um "nicht besessene Referenzen" zu erfassen.

python


myFunction { print(self.title) }                    //Erfassen von Werten durch "starke Referenz" (implizit)
myFunction { [self] in print(self.title) }          //Erfassen von Werten durch "starke Referenz" (explizit)
myFunction { [weak self] in print(self!.title) }    //Werte mit "schwachen Referenzen" erfassen
myFunction { [unowned self] in print(self.title) }  //Wert mit "nicht besessener Referenz" erfassen

Sie können die Werte auch in der Erfassungsliste benennen und einen beliebigen Ausdruck binden. Der "gebundene Ausdruck" wird ausgewertet, wenn der Abschluss erstellt und der Wert mit der angegebenen Intensität erfasst wird. Zum Beispiel:

python


// "parent"Als schwache Referenz"self.parent"Erfassen
myFunction { [weak parent = self.parent] in
    print(parent!.title) 
}

Weitere Informationen und Beispiele für Abschlussausdrücke finden Sie unter Abschlussausdrücke (https://docs.swift.org/swift-book/LanguageGuide/Closures.html#ID95). Weitere Informationen und Beispiele für Capturelists finden Sie unter Auflösen von Referenzzyklen für starke Verschlüsse (https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html#ID57).

Recommended Posts

[Swift] Erfassungsliste
[Swift5] Starten Sie ARKit ~ Motion Capture ~
Thread-sichere Liste
Listenmethode
Arbeitsliste
Linkliste