ProgrammationDéveloppeur iOS Middle

Comment fonctionne le pattern matching avec les tuples en Swift et quelles subtilités faut-il prendre en compte lors de la comparaison des tuples ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Le nombre et l'ordre des éléments doivent correspondre au tuple.
  • Les expressions de binding possibles et guard fonctionnent comme pour des variables ordinaires.
  • Un exhaustiveness check est possible uniquement pour les tuples de valeurs pour lesquelles un intervalle complet est défini.

Question piège

Peut-on utiliser la comparaison d'un tuple de type (String, Int) avec un pattern case de types différents, par exemple case (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.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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.