Un enum en Swift define un tipo de datos que puede tener un conjunto fijo de valores relacionados, conocidos como *casos*. Los enums permiten manejar opciones predefinidas y son útiles para modelar estados o categorías específicas en tu código de forma segura y clara. Además, en Swift, los enums son más potentes que en otros lenguajes porque pueden tener métodos, propiedades y valores asociados.
La declaración básica de un enum en Swift se realiza con la palabra clave enum
, seguida del nombre del enum y sus casos.
enum Dirección {
case norte
case sur
case este
case oeste
}
En este ejemplo, Dirección
es un enum que define cuatro posibles valores: norte
, sur
, este
, y oeste
.
Para utilizar un enum, simplemente asignas uno de sus valores a una variable o constante.
let direccionActual = Dirección.norte
Si el tipo de la variable ya es conocido, puedes utilizar la abreviación de punto:
let nuevaDireccion: Dirección = .oeste
Puedes comparar valores de un enum utilizando el operador de igualdad (==
).
if direccionActual == .norte {
print("Vas hacia el norte")
}
Swift permite que los enums tengan valores asociados. Esto significa que cada caso de un enum puede tener un valor adicional que lo acompaña, como parámetros adicionales.
enum Resultado {
case exito(mensaje: String)
case error(codigo: Int)
}
let resultadoExitoso = Resultado.exito(mensaje: "Operación completada")
let resultadoFallido = Resultado.error(codigo: 404)
En este ejemplo:
Resultado
tiene dos casos: exito
y error
.
Para acceder a los valores asociados de un enum, se utiliza una declaración switch
que permite descomponer el enum y extraer los valores.
switch resultadoExitoso {
case .exito(let mensaje):
print("Éxito: \(mensaje)")
case .error(let codigo):
print("Error: Código \(codigo)")
}
Además de los valores asociados, los enums en Swift también pueden tener valores crudos (*raw values*), que son valores predefinidos para cada caso. Estos valores pueden ser de tipos como String
, Int
, o Double
.
enum Moneda: String {
case dolar = "USD"
case euro = "EUR"
case yen = "JPY"
}
Aquí, cada caso del enum Moneda
está asociado con un valor crudo de tipo String
.
Puedes acceder al valor crudo de un enum de la siguiente manera:
let tipoDeMoneda = Moneda.euro
print("El valor crudo de la moneda es \(tipoDeMoneda.rawValue)")
Salida:
El valor crudo de la moneda es EUR
Es posible inicializar un enum a partir de su valor crudo, aunque esta inicialización es opcional y puede devolver nil
si el valor no coincide con ningún caso.
if let moneda = Moneda(rawValue: "USD") {
print("La moneda seleccionada es \(moneda)")
} else {
print("Moneda no válida")
}
Los enums en Swift pueden tener métodos asociados que añaden funcionalidad, permitiéndoles comportarse como objetos completos.
enum Semaforo {
case rojo, amarillo, verde
func mensaje() -> String {
switch self {
case .rojo:
return "Detente"
case .amarillo:
return "Prepárate"
case .verde:
return "Avanza"
}
}
}
let estadoActual = Semaforo.amarillo
print(estadoActual.mensaje())
Salida:
Prepárate
Swift permite declarar enums recursivos, donde uno de los casos puede contener una instancia del mismo enum como valor asociado. Para esto, se utiliza la palabra clave indirect
.
indirect enum ExpresionAritmetica {
case numero(Int)
case suma(ExpresionAritmetica, ExpresionAritmetica)
case multiplicacion(ExpresionAritmetica, ExpresionAritmetica)
}
let operacion = ExpresionAritmetica.suma(.numero(3), .multiplicacion(.numero(2), .numero(4)))
Este ejemplo representa una operación aritmética recursiva que permite expresar operaciones como sumas y multiplicaciones entre números y otras expresiones.
Los enums en Swift son una herramienta versátil que te permite definir tipos de datos con valores predefinidos, valores asociados y raw values, además de la capacidad de agregar métodos. Esto hace que los enums en Swift sean más poderosos que en otros lenguajes, proporcionando flexibilidad para manejar diversas situaciones en el código.
Para más información sobre enums en Swift, visita la documentación oficial de Swift.
Jorge García
Fullstack developer