En Swift, le matching de plage est souvent utilisé dans switch-case pour comparer des valeurs avec des plages. Pour cela, on utilise les opérateurs ..< (plage semi-ouverte) et ... (plage fermée) :
let score = 76 switch score { case 0..<60: print("Insuffisant") case 60..<80: print("Suffisant") case 80...100: print("Excellent") default: print("Valeur incorrecte") }
Spécificités :
Que se passe-t-il si dans switch vous utilisez une plage avec une limite supérieure qui n'inclut pas la valeur (par exemple, 0..<5), et que la variable est égale à 5 ?
On répond souvent que ce case sera activé, mais c'est incorrect : l'opérateur ..< n'inclut pas la limite supérieure. Exemple :
let value = 5 switch value { case 0..<5: print("0-4") case 5: print("cinq") default: print("autre") } // Affichera : "cinq"
Histoire
Un développeur a mis en œuvre l'affichage des scores des utilisateurs par plage, en utilisant une plage fermée, où la limite droite était supérieure à la valeur maximale possible. Cela faisait que certaines valeurs tombaient dans deux intervalles et la logique ne fonctionnait pas correctement.
Histoire
Dans l'application, un switch-case était utilisé avec des plages, où une des valeurs ne correspondait à aucun range en raison d'une utilisation incorrecte de l'opérateur (par exemple, 0...10 et 11...20 — la valeur 10.5 n'allait nulle part). Le bug n'a été découvert qu'en production.
Histoire
Dans le code du service, les dates étaient comparées via le range matching, en utilisant incorrectement la plage semi-ouverte : la date de fin n'était pas incluse, ce qui avait pour résultat d'éliminer les intervalles valides, rendant impossible la réservation de la date du dernier jour autorisé.