Swift – Closures

Anzeigen

Closures in Swift 4 ähneln denen von in sich geschlossenen Funktionen, die als Blöcke organisiert sind und überall wie C- und Objective-C-Sprachen aufgerufen werden. In den Funktionen definierte Konstanten und Variablenreferenzen werden erfasst und in Closures gespeichert. Funktionen werden als Sonderfälle von Schließungen betrachtet und haben die folgenden drei Formen −

Globale Funktionen Verschachtelte Funktionen Abschlussausdrücke
Hab einen Namen. Erfassen Sie keine Werte Haben einen Namen. Werte aus umschließender Funktion erfassen Unbenannte Verschlüsse erfassen Werte aus den benachbarten Blöcken

Closure Ausdrücke in Swift 4 Sprache folgen knackig, Optimierung und leichte Syntaxstile, die enthält.

  • Parameter- und Rückgabewerttypen aus dem Kontext ableiten.
  • Implizite Rückgabe von Schließungen mit einem Ausdruck.
  • Shorthand argument names and
  • Trailing closure syntax

Syntax

Es folgt eine generische Syntax zum Definieren von closure, die Parameter akzeptiert und einen Datentyp zurückgibt −

{ (parameters) −> return type in statements}

Es folgt ein einfaches Beispiel −

let studname = { print("Welcome to Swift Closures") }studname()

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

Welcome to Swift Closures

Der folgende Abschluss akzeptiert zwei Parameter und gibt einen Bool-Wert zurück −

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

Es folgt ein einfaches Beispiel −

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

Wenn wir das obige Programm mit playground ausführen, erhalten wir die folgendes Ergebnis −

10

Ausdrücke in Closures

Verschachtelte Funktionen bieten eine bequeme Möglichkeit, Codeblöcke zu benennen und zu definieren. Anstatt die gesamte Funktionsdeklaration darzustellen, werden Namenskonstrukte verwendet, um kürzere Funktionen zu bezeichnen. Die Darstellung der Funktion in einer klaren kurzen Anweisung mit fokussierter Syntax wird durch Abschlussausdrücke erreicht.

Ascending Order Program

Das Sortieren eines Strings wird durch die Swift 4s-Schlüsselreservierungsfunktion „sorted“ erreicht, die bereits in der Standardbibliothek verfügbar ist. Die Funktion sortiert die angegebenen Zeichenfolgen in aufsteigender Reihenfolge und gibt die Elemente in einem neuen Array mit derselben Größe und demselben Datentyp zurück, die im alten Array erwähnt wurden. Das alte Array bleibt gleich.

Innerhalb der sortierten Funktion werden zwei Argumente dargestellt −

  • Werte bekannten Typs werden als Arrays dargestellt.

  • Array-Inhalt (Int, Int) und gibt einen booleschen Wert (Bool) Wenn das Array richtig sortiert ist, gibt es den Wert true zurück, andernfalls wird false zurückgegeben.

Eine normale Funktion mit Eingabezeichenfolge wird geschrieben und an die sortierte Funktion übergeben, um die Zeichenfolgen in ein neues Array zu sortieren, das unten gezeigt wird −

func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

true

Das anfängliche Array, das für Icecream sortiert werden soll, wird als „Swift 4“ und „great“ angegeben. Die Funktion zum Sortieren des Arrays wird als String-Datentyp deklariert und der Rückgabetyp als Boolesch angegeben. Beide Zeichenfolgen werden verglichen und in aufsteigender Reihenfolge sortiert und in einem neuen Array gespeichert. Wenn die Sortierung erfolgreich durchgeführt wird, gibt die Funktion einen wahren Wert zurück, andernfalls wird false zurückgegeben.

Syntax des Schließungsausdrucks verwendet −

  • konstante Parameter,
  • variable Parameter und
  • Inout-Parameter.

Der Abschlussausdruck unterstützte keine Standardwerte. Variadische Parameter und Tupel können auch als Parametertypen und Rückgabetypen verwendet werden.

let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)

Wenn wir das obige Programm mit playground ausführen, erhalten wir das folgende Ergebnis −

30

Die in der function-Anweisung erwähnten Parameter und Rückgabetypdeklarationen können auch durch die Inline-Closure-Ausdrucksfunktion mit dem Schlüsselwort ‚in‘ dargestellt werden. Einmal deklarieren Parameter und Rückgabetypen ‚in‘ Schlüsselwort wird verwendet, um zu bezeichnen, dass der Körper der Schließung.

Single Expression Implicit Returns

Hier macht der Funktionstyp des zweiten Arguments der sortierten Funktion deutlich, dass ein Bool-Wert vom Abschluss zurückgegeben werden muss. Da der Hauptteil des Abschlusses einen einzelnen Ausdruck (s1 > s2) enthält, der einen Bool-Wert zurückgibt, gibt es keine Mehrdeutigkeit, und das Schlüsselwort return kann weggelassen werden.

Um eine einzelne expression-Anweisung in expression zurückzugeben, wird das Schlüsselwort ‚return‘ in seinem Deklarationsteil weggelassen.

var count: = let descending = count.sorted(by: { n1, n2 in n1 > n2 })let ascending = count.sorted(by: { n1, n2 in n1 < n2 })print(descending)print(ascending)

Wenn wir das obige Programm mit playground ausführen, erhalten wir das folgende Ergebnis −


Die Anweisung selbst definiert klar, dass, wenn string1 größer als string 2 return true andernfalls false daher return Anweisung hier weggelassen wird.

Bekannte Typenschlüsse

Betrachten Sie die Addition von zwei Zahlen. Wir wissen, dass die Addition den Datentyp integer zurückgibt. Daher werden bekannte Typenschlüsse deklariert als −

let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

-10

Deklarieren von Kurzargumentnamen als Closures

Swift 4 stellt Inline-Closures automatisch Kurzargumentnamen zur Verfügung, mit denen auf die Werte der Argumente des Closures mit den Namen $ 0, $ 1, $ 2 usw. verwiesen werden kann.

var shorthand: (String, String) -> Stringshorthand = {  }print(shorthand("100", "200"))

Hier beziehen sich $0 und $1 auf das erste und zweite Zeichenfolgenargument des Abschlusses.

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

200

Swift 4 erleichtert dem Benutzer die Darstellung von Inline-Schließungen als Kurzargumentnamen durch Darstellung $0, $1, $2 — $ n.

Die Argumentliste für Schließungen wird im Definitionsabschnitt weggelassen, wenn wir Kurzargumentnamen in Schließungsausdrücken darstellen. Basierend auf dem Funktionstyp werden die Kurzargumentnamen abgeleitet. Da das Shorthand-Argument im Ausdruckskörper definiert ist, wird das Schlüsselwort ‚in‘ weggelassen.

Schließungen als Bedienerfunktionen

Swift 4 bietet eine einfache Möglichkeit, auf die Mitglieder zuzugreifen, indem nur Bedienerfunktionen als Schließungen bereitgestellt werden. In den vorherigen Beispielen wird das Schlüsselwort ‚Bool‘ verwendet, um entweder ‚true‘ zurückzugeben, wenn die Zeichenfolgen gleich sind, andernfalls wird ‚false‘ zurückgegeben.

Der Ausdruck wird durch die Operatorfunktion in closure as noch einfacher −

let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −


Closures as Trailers

Das Übergeben des letzten Arguments der Funktion an einen closure-Ausdruck wird mit Hilfe von ‚Trailing Closures‘ deklariert. Es wird außerhalb der Funktion () mit {} geschrieben. Seine Verwendung ist erforderlich, wenn es nicht möglich ist, die Funktion inline in eine einzelne Zeile zu schreiben.

reversed = sorted(names) {  > }

wobei {$0 > $1} als abschließende Schließungen dargestellt werden, die außerhalb deklariert sind (Namen).

import Foundationvar letters = let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString})let stletters = letters.map() { .substringToIndex(advance(.startIndex, 2)).uppercaseString }print(stletters)

Wenn wir das obige Programm mit playground ausführen, erhalten wir das folgende Ergebnis −


Erfassen von Werten und Referenztypen

In Swift 4 erfolgt das Erfassen von Konstanten und Variablenwerten mit Hilfe von Closures. Es verweist weiter und ändert die Werte für diese Konstanten und Variablen innerhalb des Verschlusskörpers, obwohl die Variablen nicht mehr vorhanden sind.

Das Erfassen konstanter und variabler Werte wird durch Verwendung einer verschachtelten Funktion erreicht, indem eine Funktion mit in den Körper einer anderen Funktion geschrieben wird.

Eine verschachtelte Funktion erfasst −

  • Äußere Funktionsargumente.
  • Erfassen Sie Konstanten und Variablen, die in der äußeren Funktion definiert sind.

Wenn in Swift 4 eine Konstante oder eine Variable innerhalb einer Funktion deklariert wird, wird auch automatisch ein Verweis auf diese Variablen durch den Abschluss erstellt. Es bietet auch die Möglichkeit, mehr als zwei Variablen wie folgt als denselben Abschluss zu bezeichnen −

let decrem = calcDecrement(forDecrement: 18)decrem()

Hier zeigen oneDecrement und Decrement Variablen beide auf denselben Speicherblock als Schließungsreferenz.

func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 100 func decrementer() -> Int { overallDecrement -= total print(overallDecrement) return overallDecrement } return decrementer}let decrem = calcDecrement(forDecrement: 18)decrem()decrem()decrem()

Wenn wir das obige Programm mit playground ausführen, erhalten wir das folgende Ergebnis −

826446

Wenn die äußere Funktion calcDecrement jedes Mal aufgerufen wird, ruft sie die Funktion decrementer() auf, dekrementiert den Wert um 18 und gibt das Ergebnis mit Hilfe der äußeren Funktion calcDecrement zurück. Hier wirkt calcDecrement als Verschluss.

Obwohl die Funktion decrementer() keine Argumente hat, bezieht sie sich standardmäßig auf die Variablen ‚overallDecrement‘ und ‚total‘, indem sie ihre vorhandenen Werte erfasst. Die Kopie der Werte für die angegebenen Variablen werden mit der neuen Funktion decrementer() gespeichert. Swift 4 übernimmt Speicherverwaltungsfunktionen, indem Speicherplätze zugewiesen und freigegeben werden, wenn die Variablen nicht verwendet werden.

Anzeigen