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)) // 40Die 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.
Aufgabe
MittelErstellen Sie zwei Closure-Factories:
greaterThan(_ k: Int) -> (Int) -> Bool: gibt ein Prädikat zurück, dastrueist, wenn sein Argument strikt größer alskistscaleBy(_ k: Int) -> (Int) -> Int: gibt eine Funktion zurück, die ihr Argument mitkmultipliziert
Lesen Sie drei Zeilen ein:
- Eine Ganzzahl
threshold - Eine Ganzzahl
scale - Eine durch Kommas getrennte Liste von Ganzzahlen, die
nums
Geben Sie drei Zeilen aus:
- Die Zahlen über dem Schwellenwert (gefiltert mit der Closure von
greaterThan), verbunden mit, - Dieselben Zahlen, skaliert (gemappt mit
scaleBy), verbunden mit, - 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
3Spickzettel
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)) // 12Jeder 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
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