Latest web development tutorials

Swift-Verschluss

Verschlüsse (Verschlüsse) ist eine Funktions in sich geschlossene Codeblock, können Sie als Parameterwert verwenden oder im Code verwendet werden.

Swift Schließungen in C und Objective-C-Code-Blöcke (Blöcke) und einigen anderen Programmiersprachen anonyme Funktion sehr ähnlich ist.

Globale Funktionen und verschachtelte Funktionen ist eigentlich ein Spezialverschluss.

Schließung der Form:

globale Funktionen Verschachtelte Funktionen Expression Verschlüsse
Ich habe einen Namen, kann aber keinen Wert erfassen. Es hat einen Namen, sondern auch Wert zu erfassen, in der Funktion geschlossen. Nameless Verschluss, verwenden Sie leichte Syntax, können Sie den Wert erfassen basierend auf dem Kontext.

Swift Verschlüsse haben eine Menge Optimierung Plätze:

  1. Je nach Kontext schließen Parameter und Rückgabewert Typ
  2. Von einzeiligen Ausdruck Schließung implizite Rendite (das heißt, der Verschlusskörper nur eine Zeile Code ist, können Sie weglassen Rückkehr)
  3. Es kann verwendet werden, um den Parameternamen zu vereinfachen, wie $ 0, $ 1 (0, was darauf hinweist, dass die i-te Argument ...)
  4. Die Bereitstellung hinteren Verschluss Syntax (Nachgestellte Schließung Syntax)
  5. Grammatik

    Im Folgenden definiert einen Empfangsparameter und gibt den angegebenen Verschlusstyp Syntax:

    {(parameters) -> return type in
       statements
    }
    

    Beispiele

    import Cocoa
    
    let studname = { print("Swift 闭包实例。") }
    studname()
    

    Die obige Programmausführung Ausgabe ist:

    Swift 闭包实例。
    

    Die folgende Schließungen Form nimmt zwei Parameter und gibt einen Booleschen Wert:

    {(Int, Int) -> Bool in
       Statement1
       Statement 2
        ---
       Statement n
    }
    

    Beispiele

    import Cocoa
    
    let divide = {(val1: Int, val2: Int) -> Int in 
       return val1 / val2 
    }
    let result = divide(200, 20)
    print (result)
    

    Die obige Programmausführung Ausgabe ist:

    10
    

    Expression Verschlüsse

    Verschlüsse Ausdruck ist eine Möglichkeit, die Verwendung von einfachen Syntax inline Verschlüsse zu bauen. Closures Ausdruck Syntax bietet einige Optimierungen, so dass komponieren die Schließung wird einfach und klar.


    Sortierfunktion

    Swift Standardbibliothek stellt eine Funktion namens sort, wird es nach der Verschlussfunktion sortiert werden Sie verwendet werden bieten die bekannten Typ Werte im Array zu sortieren.

    Nach der Beendigung der Art, sort (_ :) Verfahren eine Anordnung von der gleichen Größe wie das Original zurückgibt, enthält das neue Array die gleiche Art von Element und das Element richtig sortiert wurde, wird die ursprüngliche Array nicht Art modifiziert (_ :) Methoden.

    sort (_ :) Methode nimmt zwei Argumente:

    • Ein Array von bekanntem Typ
    • Closure-Funktion, dass die Funktion Verschlüsse müssen eine Reihe von Elementen mit der gleichen Art von zwei Werten zu passieren und gibt einen Booleschen Wert, um anzuzeigen, dass der erste Parameter nach dem Ende der Sortieranlage eingehenden Reihe vor oder hinter dem zweiten Parameter. Wenn die ersten Parameterwerte vor dem zweiten Parameterwerte angezeigt werden , sortieren die Verschlussfunktion zurückgeben muss , true , im Gegensatz zu zurückkehren false .

    Beispiele

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    // 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。
    func backwards(s1: String, s2: String) -> Bool {
        return s1 > s2
    }
    var reversed = names.sort(backwards)
    
    print(reversed)
    

    Die obige Programmausführung Ausgabe ist:

    ["S", "D", "BE", "AT", "AE"]
    

    Wenn die erste Zeichenkette (s1) größer ist als die zweite Saite (s2), rückwärts Funktion gibt true zurück, was darauf hinweist, dass das neue Array vor S1 S2 erscheinen soll. Für die Zeichen in der Zeichenfolge "erscheinen später in alphabetischer Reihenfolge.", Die "größer als" bedeutet, Dies bedeutet, dass der Buchstabe "B" ist größer als der Buchstabe "A", die Zeichenkette "S" größer ist als die Zeichenfolge "D". Es wird alphabetischen Sortierung umkehren, "AT" wird vor "AE" sortiert werden.


    Parametername Abkürzung

    Swift automatisch eine Inline-Funktion Parametername Abkürzung bietet, können Sie direkt über den Parameter $ 0 Schließungen von $ 1, $ 2, um anzurufen.

    Beispiele

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort( { $0 > $1 } )
    print(reversed)
    

    $ 0 und $ 1 für die Schließung des ersten und zweiten Parameter vom Typ String.

    Die obige Programmausführung Ausgabe ist:

    ["S", "D", "BE", "AT", "AE"]
    

    Wenn Sie den Parameternamen Abkürzung in der Verschluss Ausdruck verwenden, können Sie Parameterliste Schließung seiner Definition weggelassen wird, und die entsprechenden Parameternamen Akronym Typen werden durch Funktionstyp abgeleitet werden. in Schlüsselwörter können sie auch weggelassen werden.


    Operator Funktion

    In der Tat gibt es einen kürzeren Weg das obige Beispiel Verschlüsse Ausdruck zu schreiben.

    Swift String Typ definiert auf Größer-als - Zeichen ( > string) Implementierung, als eine Funktion , die zwei nimmt String Parameter Typ und gibt einen Bool - Wert - Typ. Dies fiel zeitlich mit der sort(_:) Typ Funktion des zweiten Parameter der Methode entsprechen muss. Daher können Sie einfach einen Größer-als-Zeichen bestehen, können Swift automatisch ableiten, dass Sie verwenden möchten, ist größer als die Anzahl der String-Funktionen zu erreichen:

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort(>)
    print(reversed)
    

    Die obige Programmausführung Ausgabe ist:

    ["S", "D", "BE", "AT", "AE"]
    

    Nachgestellte Closures

    Schließung Nachgestellte ist eine Funktion in Klammern nach der Schließung von Ausdrücken, Funktionen geschrieben seinen Ruf als letzter Parameter unterstützen.

    func someFunctionThatTakesAClosure(closure: () -> Void) {
        // 函数体部分
    }
    
    // 以下是不使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure({
        // 闭包主体部分
    })
    
    // 以下是使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure() {
      // 闭包主体部分
    }
    

    Beispiele

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    //尾随闭包
    var reversed = names.sort() { $0 > $1 }
    print(reversed)
    

    sort () nach {$ 0> $ 1} Hinter Schließung.

    Die obige Programmausführung Ausgabe ist:

    ["S", "D", "BE", "AT", "AE"]
    

    Hinweis: Wenn die Funktion nur einen Parameter Ausdruck Schließungen, wenn Sie Verschlüsse verwenden Hinter, können Sie auch setzen () weggelassen.

    reversed = names.sort { $0 > $1 }
    

    Captured Wert

    Verschlüsse können konstante oder variable capture im Rahmen ihrer Definition sein.

    Auch die Definition dieser Konstanten und Variablen der ursprünglichen Domäne nicht vorhanden ist, kann der Verschluss funktionieren noch in vivo Schließung Referenzierung und Modifikation dieser Werte.

    Swift einfachste Form des Verschlusses Funktion geschachtelt, wird die Funktion im Körper der anderen Funktionen der Funktion definiert.

    Die verschachtelte Funktion kann alle seine externen Funktionsparameter und definiert Konstanten und Variablen erfassen.

    Schauen Sie sich dieses Beispiel:

    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    

    Eine Funktion makeIncrementor, hat es einen Parameter vom Typ Int amout, und es hat einen externen Parameternamen forIncremet, bedeutet, dass, wenn Sie anrufen, können Sie den externen Namen verwenden müssen. Der Rückgabewert ist ein ()-> Int - Funktion.

    In der Titelfunktion deklarieren eine Variable und eine Funktion running Inkrementierer.

    Inkrementierer Funktion bekommt keine Argumente, sondern im Körper der Funktion der running und Menge Variablen zuzugreifen. Dies ist, weil es den Körper der Funktion enthält, die durch die bestehenden running und variable Menge realisiert einzufangen.

    Da es keine Änderung Menge variabel ist, Inkrementierer tatsächlich erfassen und eine Kopie der Variablen speichern, die mit einer Kopie als Inkrementierer zusammen gespeichert wird.

    Also, wenn wir nennen diese Funktion akkumulieren:

    import Cocoa
    
    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    let incrementByTen = makeIncrementor(forIncrement: 10)
    
    // 返回的值为10
    print(incrementByTen())
    
    // 返回的值为20
    print(incrementByTen())
    
    // 返回的值为30
    print(incrementByTen())
    

    Die obige Programmausführung Ausgabe ist:

    10
    20
    30
    

    Verschlüsse sind Referenztypen

    Das obige Beispiel ist incrementByTen konstant, aber der Punkt der Schließung dieser Konstanten kann immer noch den Wert seiner variablen Erfassung zu erhöhen.

    Dies liegt daran, die Funktionen und Verschlüsse Referenztypen sind.

    Egal, ob Sie eine Funktion / Schließung auf eine konstante oder variable zugewiesen sind, setzen Sie tatsächlich den Wert der Konstante / Variable entsprechende Funktion / Schließung Referenzen. Das obige Beispiel, Verschlüsse incrementByTen Bezugspunkt eine Konstante ist, anstatt den Inhalt des Verschlusses selbst.

    Dies bedeutet auch, dass, wenn Sie die Schließung der beiden unterschiedlichen Konstanten / Variablen zuweisen, beide Werte auf den gleichen Verschluss Punkt:

    import Cocoa
    
    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    let incrementByTen = makeIncrementor(forIncrement: 10)
    
    // 返回的值为10
    incrementByTen()
    
    // 返回的值为20
    incrementByTen()
    
    // 返回的值为30
    incrementByTen()
    
    // 返回的值为40
    incrementByTen()
    
    let alsoIncrementByTen = incrementByTen
    
    // 返回的值也为50
    print(alsoIncrementByTen())
    

    Die obige Programmausführung Ausgabe ist:

    50