DEV Community

David Goyes
David Goyes

Posted on

Swift #22: Enumeraciones

Una enumeración es un tipo de dato con valores limitados. Se puede asignar cualquier nombre a los casos de la enumeración.

enum TipoDeEnumeracion {
  case estado1, estado2
  case estado3
}
variable = .estado1
variable = TipoDeEnumeracion.estado2 // Ambas sintaxis son válidas
Enter fullscreen mode Exit fullscreen mode

Evaluando posibles casos del enum con switch

Se puede evaluar el valor de una enumeración con un switch, garantizando que se cubran todos los casos. @unknown default permite levantar una advertencia (y no un error) en el caso de que aparezca un nuevo caso y sea manejado por la rama default.

enum TipoDeEnumeracion: Int {
  case estado1 = 0, estado2
  case estado3
}
var variable: TipoDeEnumeracion = TipoDeEnumeracion(rawValue: Int.random(in: 0..<3))!
switch variable {
case .estado1:
  print("Estado 1")
case .estado2, .estado3:
  print("Estado2 2 y 3")
@unknown default: // Esto saca una advertencia cuando se cree un nuevo estado
  print("Este estado no fue manejado")
}
Enter fullscreen mode Exit fullscreen mode

Valores crudos

Los casos de una enumeración pueden tener una representación en otro dominio, lo cual se conoce como valor crudo, o "Raw Value".

En el siguiente ejemplo, voy a representar cada estado de TipoDeEnumeración con un valor tipo String.

enum TipoDeEnumeracion: String {
  case estado1 = "uno", estado2 = "dos"
  case estado3 = "tres"
}
var variable = TipoDeEnumeracion.estado1
print(variable.rawValue) // "uno"
Enter fullscreen mode Exit fullscreen mode

Enumeraciones con métodos

Las enumeraciones de Swift pueden tener métodos

enum TipoDeEnumeracion: String {
  case estado1 = "uno", estado2 = "dos"
  case estado3 = "tres"

  func saludar() -> String {
    switch self {
      case .estado1:
        return "Estoy en el estado 1"
      case .estado2:
        return "No debería estar acá"
      case .estado3:
        return "Necesito cambiar de estado"
    }
  }
}
var variable = TipoDeEnumeracion.estado1
print(variable.saludar()) // "Estoy en el estado 1"
Enter fullscreen mode Exit fullscreen mode

Valores asociados a un caso

Es posible adjuntar valores a un caso de una enumeración.

enum TipoDeEnumeracion {
  case estado1(Int)
  case estado2(Bool, String)
  case estado3

  func saludar() -> String {
    switch self {
      case .estado1(let x):
        return "Estoy en el estado 1 con adjunto: \(x)"
      case .estado2(let x, let y):
        return "No debería estar acá con adjuntos: \(x), \(y)"
      case .estado3:
        return "Necesito cambiar de estado"
    }
  }
}
var variable = TipoDeEnumeracion.estado1(77)
print(variable.saludar()) // "Estoy en el estado 1 con adjunto: 77"
variable = .estado2(false, "Hola")
print(variable.saludar()) // "No debería estar acá con adjuntos: false, Hola"
Enter fullscreen mode Exit fullscreen mode

Comparar un caso específico de enumeración

Para comparar un caso específico se usa if case <caso-especifico> = variableEnum.

enum TipoDeEnumeracion {
  case estado1(Int)
  case estado2(Bool, String)
  case estado3
}
var variable = TipoDeEnumeracion.estado1(77)
if case .estado1(let x) = variable {
  print("Estoy en el estado 1 con adjunto: \(x)")
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)