El pattern matching para tuples en Swift permite comparar y desempaquetar valores de manera conveniente. En switch se pueden descomponer tuples directamente en el patrón:
let point = (x: 0, y: 2) switch point { case (0, 0): print("En el origen") case (0, let y): print("x = 0, y = \(y)") case let (x, y) donde x == y: print("x es igual a y") default: print("Otro punto") }
Aspectos a considerar:
¿Se puede usar en switch-case la comparación de un tuple de tipo
(String, Int)con un patrón case de diferentes tipos, por ejemplocase (let a, let b):?
A menudo se responde que sí, pero es importante: los tipos de las variables en el patrón deben corresponder estrictamente al tipo de la tupla.
let pair = ("abc", 5) switch pair { case (let text, let number): print("Cadena: \(text), número: \(number)") // Bien case (let x, let y) donde x == y: print("Error") // Error: El operador binario '==' no se puede aplicar a operandos de tipo 'String' y 'Int' default: break }
Si los tipos no coinciden, el compilador generará un error en tiempo de compilación.
Historia
En un proyecto, intentaron usar switch-case para analizar la respuesta del servidor como tuple, sin considerar los posibles valores nil. Esto llevó a que ningún case coincidiera, y se activara el default, aunque se preveía otra lógica.
Historia
Desajuste de tipos: en la función manejadora, el tuple recibía (Int, String), pero intentaron desempacar como (String, Int). El resultado fue un crash en tiempo de compilación y tiempo perdido buscando la causa.
Historia
Usaron guard para desempaquetar el tuple del resultado sin considerar el caso de valores negativos, aunque el manejo solo se preveía para números positivos. Como resultado, parte de los casos válidos fue ignorada, lo que resultó ser un problema en la lógica del negocio.