Trailing Closures
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 39 von 56.
Wenn ein Closure das letzte Argument einer Funktion ist, können Sie es außerhalb der Klammern schreiben. Dies ist die Trailing-Closure-Form, und so lässt sich Swift-Code natürlich lesen.
let nums = [1, 2, 3]
// Standardform
let a = nums.map({ $0 * 2 })
// Trailing-Closure-Form
let b = nums.map { $0 * 2 }Wenn die Closure das einzige Argument ist, verschwinden auch die Klammern. Deshalb liest sich alles, was Sie bisher gesehen haben, wie eine benutzerdefinierte Kontrollstruktur.
Du kannst deine eigenen Funktionen schreiben, die Closures auf die gleiche Weise entgegennehmen:
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}Die Trailing-Closure-Form sorgt dafür, dass repeatN(3) { ... } sich wie eine eingebaute Schleife liest. Das ist der Punkt: Kontrollstrukturen, die Sie selbst erstellen, sehen genauso aus wie die aus der Standardbibliothek.
Aufgabe
EinfachDefinieren Sie eine Funktion collect, die:
- Einen Integer
nund eine Closurebuilder: (Int) -> Stringentgegennimmt builderfür jedesivon1bis einschließlichnaufruft und das Array der resultierenden Strings zurückgibt
Lesen Sie einen Integer von stdin ein, rufen Sie collect mit diesem Integer unter Verwendung einer Trailing Closure auf, die "i=\(i)" für jeden Wert erzeugt, und geben Sie das zusammengefügte Ergebnis mit , aus.
Für die Eingabe 4 lautet die Ausgabe i=1,i=2,i=3,i=4.
Spickzettel
Trailing-Closure-Syntax: Wenn ein Closure das letzte Argument ist, kann es außerhalb der Klammern geschrieben werden. Wenn es das einzige Argument ist, werden die Klammern ganz weggelassen.
let nums = [1, 2, 3]
let a = nums.map({ $0 * 2 }) // Standard
let b = nums.map { $0 * 2 } // Trailing ClosureEigene Funktionen können Closures auf die gleiche Weise akzeptieren, wodurch sie sich wie integrierte Kontrollstrukturen lesen lassen:
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}Probier es selbst
let n = Int(readLine()!)!
// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// dann `collect(n) { ... }` aufrufen und mit "," verbunden ausgeben
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimmenSuchen in StringsTeilen und ZusammenfügenTeilstrings ersetzenWiederholung – Benutzernamen-Check4Mengen
Mengen erstellenVereinigung und SchnittmengeDifferenz und symmetrische DifferenzTeilmenge und ObermengeRückblick – Tag-Filter7Projekt - Habit Tracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteRange-MethodenRanges in SwitchRückblick – Kalender-Grid5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerkettung von map, filter, reduceRückblick – Wortstatistiken8Closures
Closure-GrundlagenTrailing ClosuresWerte erfassenClosures zurückgebenEigene Higher-OrderRückblick – Pipeline Builder