Recherche optionnelle
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 13 sur 56.
Les indices de dictionnaire retournent toujours un Optional : la valeur lorsque la clé existe, nil lorsqu'elle n'existe pas. Swift vous oblige à gérer les deux cas.
let prices: [String: Int] = ["apple": 1, "bread": 3]
let p = prices["apple"]
print(p) // Optional(1)Trois manières idiomatiques de gérer l'optionnel. Choisissez celle qui convient à la situation.
1. if let : gérez les deux branches explicitement :
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. coalescence nil ?? : fournit une valeur de repli en ligne :
let p = prices["olive"] ?? 0 // 03. subscript avec valeur par défaut : résultat identique, mais la valeur par défaut reste également en place si vous écrivez à nouveau dans cette clé :
var counts = ["a": 2]
counts["b", default: 0] += 1 // counts == ["a": 2, "b": 1]Défi
FacileLe dictionnaire prices est fourni. Lisez une seule ligne d'entrée : une liste d'articles séparés par des virgules que l'utilisateur souhaite acheter.
Pour chaque article, dans l'ordre de saisie, recherchez-le dans prices. Affichez une ligne par article :
<item> @ <price>lorsque l'article est présent dans le dictionnaire<item> not soldsinon
Après avoir listé chaque article, affichez une dernière ligne : Total: <sum>. Traitez les articles manquants comme coûtant 0 en utilisant l'opérateur de fusion nil (nil-coalescing operator).
Pour l'entrée apple,bread,olive,milk, la sortie est :
apple @ 1
bread @ 3
olive not sold
milk @ 4
Total: 8Aide-mémoire
Les indices de dictionnaire retournent un Optional — la valeur si la clé existe, nil sinon.
1. if let — gérer les deux branches :
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. Coalescence nulle ?? — fournir une valeur de repli :
let p = prices["olive"] ?? 0 // 03. Indice avec valeur par défaut — une valeur de repli qui fonctionne aussi à l'écriture :
var counts = ["a": 2]
counts["b", default: 0] += 1 // ["a": 2, "b": 1]Essayez vous-même
let prices: [String: Int] = ["apple": 1, "bread": 3, "milk": 4]
let items = readLine()!.components(separatedBy: ",")
// À FAIRE : recherche par article ; afficher '@ prix' ou 'non vendu' ; sommer avec ?? 0
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