Construction de pipelines
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 31 sur 56.
Les méthodes que vous avez collectées, map, filter, reduce, compactMap, flatMap, sorted(by:), constituent la boîte à outils quotidienne de Swift. Le code réel les assemble.
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"]Lisez la chaîne de haut en bas : gardez les commandes non vides, triez par quantité décroissante, puis ne gardez que les noms.
Les pipelines sont plus performants lorsque chaque étape n'a qu'un seul objectif. Si vous vous retrouvez à faire deux choses à la fois à l'intérieur d'une closure (mapper et filtrer), divisez-les en deux étapes. La chaîne reste lisible au fur et à mesure qu'elle s'allonge.
Défi
MoyenLisez une seule ligne d'entrée : une liste d'entrées name:price:qty séparées par des virgules. Certaines entrées sont malformées et doivent être ignorées : toute entrée dont le prix ou la quantité n'est pas un entier valide.
Construisez un pipeline qui produit une ligne par entrée valide avec qty > 0, triée par total (price * qty) décroissant, au format :
<name>: <total>Après les lignes par article, affichez une ligne de résumé : Sum: <n> avec le total général.
Pour l'entrée apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7, la sortie est :
milk: 20
salt: 14
apple: 6
Sum: 40Aide-mémoire
Le chaînage de fonctions d'ordre supérieur crée des pipelines lisibles où chaque étape a un seul but :
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
Méthodes de pipeline courantes : filter → compactMap → sorted(by:) → map → reduce. Si une closure fait deux choses à la fois (par exemple, le mapping et le filtrage), divisez-la en deux étapes.
Essayez vous-même
let entries = readLine()!.components(separatedBy: ",")
// TODO: pipeline utilisant compactMap (analyser), filter (qté > 0),
// sorted (total décroissant), map (formater); afficher les lignes + Somme
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Comptage et indicesCasse et nettoyageRecherche dans les chaînesDécoupage et jointureRemplacement de sous-chaînesRécapitulatif - Vérification du nom d'utilisateur4Ensembles
Création d'ensemblesUnion et intersectionSoustraction et différence symétriqueSous-ensemble et sur-ensembleRécapitulatif - Filtre de tags7Projet - Suivi d'habitudes
Aperçu du projetMarquer comme terminé10Projet - Moteur de quiz
Présentation du projetPoser des questions2Intervalles et Pas
Fermé vs Semi-ouvertLe PasMéthodes d'intervalleIntervalles dans un SwitchRécapitulatif - Grille de calendrier5Fonctions d'ordre supérieur, Partie 1
MapFilterReduceChaînage de map, filter, reduceRécapitulatif - Statistiques de mots3Dictionnaires
Déclarer des dictionnairesRecherche optionnelleMettre à jour des dictionnairesParcourir des dictionnairesGrouper des valeursRécapitulatif - Inventaire6Fonctions d'ordre supérieur, partie 2
compactMapflatMapsorted(by:)Construction de pipelinesRécapitulatif - Tableau de classement