Menu
Coddy logo textTech

Closures zurückgeben

Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 41 von 56.

Sie haben gesehen, wie makeCounter eine Closure zurückgibt. Derselbe Trick ermöglicht es Ihnen, konfigurierbares Verhalten zu erstellen: Parameter einmal entgegennehmen und eine Funktion zurückerhalten, die diese mehrmals verwendet.

func multiplier(_ k: Int) -> (Int) -> Int {
    return { n in n * k }
}

let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4))                  // 12
print(tenfold(4))                 // 40

Die zurückgegebene Closure erfasst k, sodass jeder multiplier(...)-Aufruf eine brandneue Closure mit ihrem eigenen k erzeugt.

Dieses Muster ist der Kern von „Strategy“-Code in Swift: Schreiben Sie eine Funktion, die eine Konfiguration entgegennimmt und ein Closure zurückgibt, und übergeben Sie das Closure dann an map, filter, sorted(by:) oder an jede andere Stelle, an der ein Wert in Form einer Funktion erwartet wird.

challenge icon

Aufgabe

Mittel

Erstellen Sie zwei Closure-Factories:

  • greaterThan(_ k: Int) -> (Int) -> Bool: gibt ein Prädikat zurück, das true ist, wenn sein Argument strikt größer als k ist
  • scaleBy(_ k: Int) -> (Int) -> Int: gibt eine Funktion zurück, die ihr Argument mit k multipliziert

Lesen Sie drei Zeilen ein:

  1. Eine Ganzzahl threshold
  2. Eine Ganzzahl scale
  3. Eine durch Kommas getrennte Liste von Ganzzahlen, die nums

Geben Sie drei Zeilen aus:

  1. Die Zahlen über dem Schwellenwert (gefiltert mit der Closure von greaterThan), verbunden mit ,
  2. Dieselben Zahlen, skaliert (gemappt mit scaleBy), verbunden mit ,
  3. Wie viele Zahlen den Filter passiert haben

Für die Eingabe 5 / 3 / 2,7,3,8,9 lautet die Ausgabe:

7,8,9
21,24,27
3

Spickzettel

Eine Closure-Factory ist eine Funktion, die einen Parameter erfasst und eine neue, dadurch konfigurierte Closure zurückgibt:

func multiplier(_ k: Int) -> (Int) -> Int {
    return { n in n * k }
}

let triple = multiplier(3)
print(triple(4))   // 12

Jeder Aufruf erzeugt eine brandneue Closure mit ihrem eigenen erfassten Wert von k. Die zurückgegebenen Closures können direkt an map, filter, sorted(by:) usw. übergeben werden:

func greaterThan(_ k: Int) -> (Int) -> Bool {
    return { n in n > k }
}

let nums = [2, 7, 3, 8, 9]
let filtered = nums.filter(greaterThan(5))  // [7, 8, 9]
let scaled = filtered.map(multiplier(3))    // [21, 24, 27]

Probier es selbst

let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: greaterThan, scaleBy; filtern, dann mappen; Ergebnis zusammengefügt ausgeben und Anzahl zählen
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