En Swift, las construcciones switch y enum están implementadas con potentes capacidades de coincidencia de patrones y estricta seguridad de tipos, lo que las distingue de la mayoría de los análogos en otros lenguajes.
En C y C++, así como en Objective-C, las enumeraciones son simplemente un conjunto de valores enteros, y los operadores switch comparan los valores por coincidencia. En Swift, las enumeraciones (enum) son mucho más poderosas: admiten valores asociados, propiedades calculadas y métodos. El operador switch admite coincidencia de patrones, protección contra ramificaciones incompletas y trabaja con rangos, tuplas, opcionales y mucho más.
En lenguajes tradicionales, el switch a menudo conduce a errores relacionados con la falta de exhaustividad (consideración completa de todos los casos), errores de tipos y la imposibilidad de almacenar datos adicionales de manera segura en los casos de enum. Esto resulta en errores en tiempo de ejecución, no de compilación.
En Swift, el switch requiere el manejo completo de todos los casos, a menos que la enumeración esté explícitamente marcada como @unknown default. Los valores asociados permiten almacenar elegantemente información adicional en los casos de enum. Ejemplo:
enum NetworkResult { case success(Int) case failure(String) } func handle(result: NetworkResult) { switch result { case .success(let code): print("Éxito con código: \(code)") case .failure(let error): print("Fallo con error: \(error)") } }
Características clave:
¿Es necesario siempre escribir default en switch por enum?
No, si todos los casos de la enumeración están cubiertos explícitamente, no se necesita default. Además, no se recomienda usar default sin necesidad, ya que el compilador puede no advertir sobre nuevos casos de enum al agregarlos.
¿Se puede usar fallthrough para una transición automática entre casos?
Sí, la palabra clave fallthrough está disponible, pero debe usarse con cuidado. No transfiere los valores asociados, y tales transiciones no son comunes en la práctica real de Swift.
switch number { case 1: print("uno") fallthrough case 2: print("o dos") default: print("otro") }
¿Puede un enum en Swift ser comparado por rawValue si tiene valores asociados?
No. Solo las enumeraciones sin valores asociados y con rawValue explícitamente indicado pueden ser inicializadas y comparadas a través de rawValue.
Un desarrollador agregó un caso default en un switch por enum NetworkResult, lo que llevó a que al agregar un nuevo caso, la lógica de manejo no se actualizara y el programa funcionara incorrectamente "silenciosamente".
Pros: No hay advertencias del compilador al agregar casos.
Contras: Los errores se manifiestan durante la ejecución de la aplicación, la lógica no se actualiza automáticamente.
Un empleado se abstuvo de usar default en switch por enum, lo que permitió al compilador detectar la falta de manejo de nuevos casos después de su adición.
Pros: Los errores se detectan en el momento de la compilación, el comportamiento de la aplicación se vuelve más predecible.
Contras: Con un gran número de casos se necesita más código, pero se gana en fiabilidad.