Tutorial Swift - Enums Swift (Aprende a programar apps para iOS)
Tutorial Swift - Enums Swift (Aprende a programar apps para iOS)

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)

SwiftBeta

Tabla de contenido


👇 SÍGUEME PARA APRENDER SWIFTUI, SWIFT, XCODE, etc 👇
Aprende Swift desde cero

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
}
Enum en Swift

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")
Enum con associated values en Swift

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)
Class y Struct en Swift
En Swift podemos usar Class o Struct para crear instancias de un tipo, cada una tiene sus características. Si estáis en algún proceso de selección os recomiendo leer este post por si os cae la típica pregunta de ¿cuáles son las principales diferencias entre una clase y un struct?

Sintaxis de un Enum en Swift

Como hemos visto en el ejemplo anterior, usamos la keyword Enum:

enum SomeEnumeration {
	// enumeration definition goes here
}
Sintaxis de un Enum en Swift

Podemos crear un enum que nos indique los puntos cardinales:

enum CompassPoint {
    case north
    case south
    case east
    case west
}
Cases de un Enum en Swift

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
Asignar valores de un Enum a una variable en Swift

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"
¿Cómo usar Switch en Swift?

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"
Enum allCases en Swift

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")
Associated Values en Swift
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"
Pasar valores asociados a los cases de un Enum en Swift

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.