ProgrammationDéveloppeur Swift

Comment fonctionne le pattern matching pour les plages (ranges) en Swift et quelles spécificités faut-il prendre en compte lors de la comparaison avec switch ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Les plages doivent être croissantes : de la plus petite à la plus grande (sinon, la plage sera vide).
  • Le matching sera réussi si la valeur est à l'intérieur de la plage.
  • Étant donné que les plages sont des structures, elles peuvent être utilisées pour le matching avec tous les types Comparable.

Question piège

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"

Exemples d'erreurs réelles dues à la méconnaissance des subtilités du sujet


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é.