compactMap
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 28 sur 56.
compactMap est map avec les optionnels filtrés. La fermeture peut renvoyer un Optional ; compactMap élimine les résultats nil et déballe le reste.
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers) // [3, 7, 1]Int("hi") retourne nil car il ne peut pas analyser de nombre à partir de "hi". compactMap les élimine automatiquement et vous donne un [Int] propre.
Sans cela, vous écririez strings.map { Int($0) } et obtiendriez un [Int?] avec des nils mélangés, puis vous devriez les filtrer vous-même. compactMap effectue les deux étapes en une seule.
Défi
FacileLisez une seule ligne d'entrée : un mélange d'entiers et de texte inutile séparés par des virgules (certaines entrées ne peuvent pas être analysées).
Affichez :
- Les entiers (dans l'ordre d'entrée), joints par
, - Le nombre d'entrées qui ont été ignorées (n'ont pas pu être analysées)
- La somme des entiers analysés
Pour l'entrée 3,hi,7,!,1,42,oops, la sortie est :
3,7,1,42
3
53Aide-mémoire
compactMap fonctionne comme map mais supprime automatiquement les résultats nil et déballe le reste :
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1] — les nils provenant de chaînes non analysables sont supprimésSans compactMap, map retournerait [Int?] avec des nils mélangés, nécessitant une étape de filtrage séparée.
Essayez vous-même
let parts = readLine()!.components(separatedBy: ",")
// TODO: compactMap vers des entiers ; afficher les éléments joints, le nombre d'éléments supprimés, la 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