Menu
Coddy logo textTech

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.

challenge icon

Défi

Moyen

Lisez 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: 40

Aide-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 : filtercompactMapsorted(by:)mapreduce. 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
quiz iconTestez-vous

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