Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Definieren Sie eine Funktion collect, die:

  • Einen Integer n und eine Closure builder: (Int) -> String entgegennimmt
  • builder für jedes i von 1 bis einschließlich n aufruft 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 Closure

Eigene 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss