Nachgestellte Closures
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy. Lektion 39 von 56.
Wenn eine Closure das letzte Argument einer Funktion ist, kannst du sie außerhalb der Klammern schreiben. Dies ist die Form der trailing-closure, und so liest sich Swift-Code ganz natürlich.
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 Form mit nachgestelltem Closure lässt repeatN(3) { ... } wie eine integrierte Schleife wirken. Genau darum geht es: Kontrollstrukturen, die du selbst erstellst, sehen genauso aus wie die aus der Standardbibliothek.
Aufgabe
EinfachDefiniere eine Funktion collect, die:
- eine Ganzzahl
nund eine Closurebuilder: (Int) -> Stringentgegennimmt builderfür jedesivon1bis einschließlichnaufruft und das Array der resultierenden Zeichenfolgen zurückgibt
Lies eine Ganzzahl von stdin ein, rufe collect mit dieser Ganzzahl und einer nachgestellten Closure auf, die für jeden Wert "i=<i>" erzeugt, und gib das verbundene Ergebnis mit , aus.
Für die Eingabe 4 lautet die Ausgabe i=1,i=2,i=3,i=4.
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 TrimSuchen in StringsAufteilen und ZusammenfügenTeilstrings ersetzenRückblick – Benutzernamen prüfen4Mengen
Mengen erstellenVereinigung und SchnittmengeSubtraktion und symmetrische DifferenzTeilmenge und ObermengeWiederholung – Tag-Filter7Projekt – Gewohnheitstracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteBereichsmethodenBereiche in SwitchRückblick – Kalender-Raster5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerketten von Map, Filter und ReduceRückblick – WortstatistikÜbe selbstständig: Swift-Playground