Le pattern matching pour les tuples en Swift permet de comparer et de décomposer les valeurs de manière pratique. Dans le switch, vous pouvez décomposer des tuples directement dans le pattern :
let point = (x: 0, y: 2) switch point { case (0, 0): print("À l'origine des coordonnées") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("x égal à y") default: print("Un autre point") }
Subtilités :
Peut-on utiliser la comparaison d'un tuple de type
(String, Int)avec un pattern case de types différents, par exemplecase (let a, let b):?
On répond souvent que c'est possible, mais il est important que les types des variables dans le pattern correspondent strictement au type du tuple.
let pair = ("abc", 5) switch pair { case (let text, let number): print("Chaîne : \(text), nombre : \(number)") // Ok case (let x, let y) where x == y: print("Erreur") // Erreur : L'opérateur binaire '==' ne peut pas être appliqué aux opérandes de type 'String' et 'Int' default: break }
Si les types ne correspondent pas, le compilateur générera une erreur à l'étape de compilation.
Histoire
Dans un projet, nous avons essayé d'utiliser switch-case pour analyser la réponse du serveur comme un tuple, sans tenir compte des valeurs possibles nil. Cela conduisait à ce qu'aucun case ne correspondait, et le default était déclenché, alors qu'une autre logique était prévue.
Histoire
Non-correspondance des types : dans la fonction, le gestionnaire du tuple recevait (Int, String), mais nous avons essayé de le décomposer comme (String, Int). Résultat — crash à l'étape de compilation et perte de temps à chercher la raison.
Histoire
Nous avons utilisé guard pour décomposer le tuple de résultat sans tenir compte de la possibilité de valeurs négatives, bien que le traitement était prévu uniquement pour les nombres positifs. En conséquence, une partie des cas valides était ignorée, ce qui a posé problème dans la logique commerciale.