
ENUMS en Swift en Español - Curso Swift | Tutorial Swift
Los Enums en Swift son muy útiles cuando trabajamos con el mismo tipo pero con valores que tienen relación entre sí. Son muy útiles para aplicar en ciertas partes de una app móvil. Por ejemplo los distintos estados que puede tener un mensaje de la típica app de mensajería (sent, received, etc)
Tabla de contenido
Los Enums definen un tipo común para un grupo de valores relacionados y permite trabajar con estos valores de una manera segura dentro de tu código.
enum MessageStatus {
case sent
case received
case read
}
También podemos usar associated values en cada case del Enum. Entraremos en detalle más abajo, pero vamos a ver un ejemplo para hacernos una idea:
enum Status {
case sent(messageId: String)
case received(messageId: String)
case read
}
let status = Status.sent(messageId: "12345678")
Los Enums en Swift son value type, es decir, cuando se asigna a una variable su valor se copia. Igual que veíamos con las structs.
Recuerda que las clases eran reference type y por lo tanto cuando se asigna a varias variables, todas ellas comparten la misma referencia. Un cambio en una variable implica que también se aplica a las otras variables (con la misma referencia)

Sintaxis de un Enum en Swift
Como hemos visto en el ejemplo anterior, usamos la keyword Enum:
enum SomeEnumeration {
// enumeration definition goes here
}
Podemos crear un enum que nos indique los puntos cardinales:
enum CompassPoint {
case north
case south
case east
case west
}
Podríamos defines todos los cases en una sola línea de la siguiente manera:
enum CompassPoint {
case north, south, east, west
}
Y para asignarlo a una variable es tan fácil como:
var pointOne: CompassPoint = .north
var pointTwo = CompassPoint.north
Matching con Switch en Swift
Es muy útil usar switch cuando tenemos un Enum, ya que en cada caso podemos aplicar una lógica distinta:
switch pointTwo {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
case .east:
print("Where the sun rises")
case .west:
print("Where the skies are blue")
}
// El resultado que sería "Lots of planets have a north"
Iterando sobre los casos de un Enum en Swift
Con Swift 5.2 salió un protocolo para poder iterar de forma muy sencilla todos los casos de un Enum, solo nos basta con conformar CaseIterable en cualquier Enum para tener este comportamiento, vamos a ver un ejemplo:
enum Week: CaseIterable {
case monday
case tuesday
case wednesday
case thursday
case friday
case saturday
case sunday
}
let numberOfDays = Week.allCases.count
print("Week days: \(numberOfDays)")
// El resultado es "Week days: 7"
Associated Values en Swift
Vamos a entrar más en detalle con los associated values. A veces no es útil guardar valores de otro tipo junto con el caso del Enum. Esa información "extra" que asociamos al case es un associated value, un ejemplo muy sencillo sería el siguiente:
enum Field {
case name(String)
case street(String)
case phone(number: String)
}
let name: Field = .name("Loop Infinito")
Los associated values son muy útiles para aportar más información a cada case
Raw Values en Swift
Como alternativa a los associated values, los casos de un Enum pueden estar prepopulados con valores por defecto (llamados raw values), los cuales son del mismo tipo.
Aquí tenemos un ejemplo:
enum MessageEncoded: String {
case keyOne = "12345678"
case keyTwo = "qwerty"
}
let messageEncoded = MessageEncoded.keyOne.rawValue
messageEncoded
// El resultado es "12345678"
Los raw values pueden ser strings, characters o cualquier tipo que represente números.
Hay varias manera de dar este valor por defecto a los cases de un enum, en el caso de dar valores enteros podemos hacer:
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Indicando que empezamos por el número 1 en mercury, y automáticamente se incrementará en uno en cada caso. Eso significa que venus tendrá un raw value de 2, earth de 3, etc.