Comment vérifier si une clé existe dans un dictionnaire Swift et récupérer la valeur : guide complet pour débutants et experts
\n\nTravailler avec des dictionnaires est le pain quotidien de tout développeur iOS. Mais dès que l'on passe de la simple "insertion de valeur" à "est-ce que cette clé existe ?" — les complications commencent. Cette question a recueilli des milliers de vues sur Stack Overflow, et ce n'est pas sans raison : une tâche apparemment simple cache plusieurs pièges.
\n\nDans cet article, nous ne répondrons pas simplement à la question "Determining if Swift dictionary contains key and obtaining any of its values", mais nous détaillerons 5 approches différentes. Vous découvrirez quelle méthode est la plus rapide, laquelle est la plus sûre, et laquelle est simplement un code élégant, agréable à écrire et à lire.
\n\nPetit rappel : qu'est-ce qu'un Dictionary en Swift ?
\n\nPour ceux qui découvrent Swift : Dictionary est une collection de paires "clé-valeur". Les clés sont uniques, les valeurs peuvent se répéter. Cela ressemble à ceci :
var userScores: [String: Int] = [\n "Alice": 95,\n "Bob": 87,\n "Charlie": 92\n]\n\nImaginez maintenant : vous voulez obtenir le score d'un joueur nommé "David". Mais David n'est pas dans le dictionnaire. Si vous écrivez simplement userScores["David"], Swift ne plantera pas, mais retournera nil. Et c'est là que les choses deviennent intéressantes.
Méthode n°1 : Le classique if let — la base que tout le monde doit connaître
\n\nLa méthode la plus simple et la plus lisible consiste à utiliser la liaison optionnelle (optional binding) avec if let. Vous vérifiez à la fois si la clé existe et obtenez la valeur :
let scores: [String: Int] = ["Alice": 95, "Bob": 87]\n\nif let aliceScore = scores["Alice"] {\n print("Score d'Alice : \\(aliceScore)")\n} else {\n print("Joueur non trouvé")\n}\n\nAvantages :
\n- \n
- Code extrêmement lisible \n
- Gestion sécurisée des optionnels \n
- Aucun appel de méthode supplémentaire nécessaire \n
Inconvénients :
\n- \n
- Si vous avez seulement besoin de vérifier la présence de la clé sans obtenir la valeur — c'est redondant \n
Cette approche est l'étalon-or pour 90% des cas. C'est celle recommandée dans la documentation officielle d'Apple.
\n\nMéthode n°2 : Guard let — pour une sortie anticipée de la fonction
\n\nSi vous écrivez une fonction où l'absence de la clé est une raison de sortir immédiatement, utilisez guard let. Cela rend le code plat et évite la "pyramide de la mort" des if imbriqués :
func printScore(for player: String, in scores: [String: Int]) {\n guard let score = scores[player] else {\n print("Joueur \\(player) non trouvé")\n return\n }\n // Ici, nous sommes sûrs que score existe\n print("Score du joueur \\(player) : \\(score)")\n}\n\nprintScore(for: "Bob", in: ["Alice": 95, "Bob": 87]) // Score du joueur Bob : 87\nprintScore(for: "David", in: ["Alice": 95, "Bob": 87]) // Joueur David non trouvé\n\nAvantages :
\n- \n
- Séparation claire entre le "chemin d'erreur" et le "scénario principal" \n
- La variable est accessible dans toute la portée après guard \n
Inconvénients :
\n- \n
- Ne convient pas si vous avez seulement besoin de vérifier la présence sans sortir de la fonction \n
Méthode n°3 : Vérification via contains(where:) — quand la clé peut être complexe
\n\nParfois, vous n'avez pas seulement besoin de trouver une clé, mais de la vérifier selon une condition. Par exemple, la clé est une chaîne et vous cherchez une correspondance partielle. C'est là que la méthode contains(where:) vient à la rescousse :
\n\nlet config: [String: Any] = [\n "app_version": "2.1.0",\n "build_number": 42,\n "is_debug_mode": true\n]\n\n// Recherche d'une clé qui commence par "app_"\nlet hasAppKey = config.keys.contains { $0.hasPrefix("app_") }\nprint("Il y a une clé app_ : \\(hasAppKey)") // true\n\n// Obtention de la valeur par la première clé trouvée\nif let appKey = confi