Pipelines erstellen
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 31 von 56.
Die Methoden, die Sie gesammelt haben, map, filter, reduce, compactMap, flatMap, sorted(by:), sind das alltägliche Swift-Toolkit. Echter Code fügt sie zusammen.
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]Lesen Sie die Kette von oben nach unten: Behalten Sie nicht-leere Bestellungen bei, sortieren Sie absteigend nach der Menge und behalten Sie dann nur die Namen.
Pipelines gewinnen, wenn jeder Schritt einen einzigen Zweck hat. Wenn Sie feststellen, dass Sie zwei Dinge gleichzeitig innerhalb eines Closures tun (Mapping und Filtern), teilen Sie diese in zwei Schritte auf. Die Kette bleibt lesbar, während sie wächst.
Aufgabe
MittelLies eine einzelne Eingabezeile ein: eine durch Kommas getrennte Liste von name:price:qty Einträgen. Einige Einträge sind fehlerhaft und sollten übersprungen werden: jeder Eintrag, dessen Preis oder Menge keine gültige Ganzzahl ist.
Erstelle eine Pipeline, die eine Zeile pro gültigem Eintrag mit qty > 0 erzeugt, sortiert nach der Gesamtsumme (price * qty) absteigend, im Format:
<name>: <total>Gib nach den zeilenweisen Angaben eine Zusammenfassungszeile aus: Sum: <n> mit der Gesamtsumme.
Für die Eingabe apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7 lautet die Ausgabe:
milk: 20
salt: 14
apple: 6
Sum: 40Spickzettel
Das Verketten von Funktionen höherer Ordnung erzeugt lesbare Pipelines, bei denen jeder Schritt einen einzigen Zweck erfüllt:
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
Gängige Pipeline-Methoden: filter → compactMap → sorted(by:) → map → reduce. Wenn ein Closure zwei Dinge gleichzeitig tut (z. B. Mapping und Filtern), teilen Sie es in zwei Schritte auf.
Probier es selbst
let entries = readLine()!.components(separatedBy: ",")
// TODO: Pipeline mit compactMap (parse), filter (qty > 0),
// sorted (total desc), map (format); Zeilen + Sum 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 – Wortstatistiken3Dictionaries
Dictionaries deklarierenOptionaler LookupDictionaries aktualisierenÜber Dictionaries iterierenWerte gruppierenZusammenfassung – Inventar6Funktionen höherer Ordnung Teil 2
compactMapflatMapsorted(by:)Pipelines erstellenZusammenfassung – Bestenliste