ProgramaciónDesarrollador iOS/Swift

¿Qué es un 'enum con valores asociados' en Swift y cuándo es recomendable usar esta construcción en lugar de clases o estructuras?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

'Enums con valores asociados' en Swift permiten que cada caso mantenga valores individuales (de diferentes tipos). Este enum se convierte efectivamente en un tipo de dato algebraico (Algebraic Data Type), lo que se adapta perfectamente para expresar un conjunto finito de opciones con diferentes datos adicionales.

Utiliza esta construcción:

  • Para modelar estados (por ejemplo, estados de carga, resultados de operaciones: éxito/error, etc.)
  • Cuando la opción requiere parámetros adicionales que difieren en tipo
  • Para patrones type-safe y reducción de ramificaciones switch

Ejemplo de código:

enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("Datos recibidos: \(data)") case .failure(let error): print("Error: \(error.localizedDescription)") } }

Pregunta capciosa.

¿Se puede crear un enum dentro de otro enum (enums anidados), y para qué podría ser útil?

Respuesta: Sí, Swift admite enumeraciones anidadas. Esto es conveniente para modelar estados anidados y proporcionar alcance. Por ejemplo:

enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }

Ejemplos de errores reales debido a la falta de conocimiento sobre los matices del tema.


Historia

En un proyecto se implementó un modelo complejo de estados de solicitud a través de un enum con valores asociados, sin embargo, al agregar nuevos casos en el switch no se realizó el manejo de default. Esto llevó a errores silenciosos, que eran difíciles de detectar en tiempo de ejecución, en lugar de en la etapa de compilación.


Historia

Un desarrollador intentó serializar un enum con valores asociados directamente en JSON. Sin soporte manual de Codable para cada caso, la aplicación perdía datos durante la decodificación, lo que causaba errores críticos al sincronizarse con el servidor.


Historia

En la capa de red, solo se usaron clases para pasar errores, en lugar de enums. Debido a esto, la lista de errores creció rápidamente, aparecieron tipos duplicados y se complicó el mantenimiento, a diferencia de una solución con enums, donde la lista de errores sería type-safe y centralizada.