Swift Language Enums con valores asociados.


Ejemplo

Los casos de enumeración pueden contener una o más cargas útiles ( valores asociados ):

enum Action {
    case jump
    case kick
    case move(distance: Float)  // The "move" case has an associated distance
}

La carga útil debe proporcionarse al instanciar el valor de enumeración:

performAction(.jump)
performAction(.kick)
performAction(.move(distance: 3.3))
performAction(.move(distance: 0.5))

La instrucción switch puede extraer el valor asociado:

switch action {
case .jump:
    ...
case .kick:
    ...
case .move(let distance):  // or case let .move(distance):
    print("Moving: \(distance)") 
}

Una extracción de un solo caso se puede hacer usando el if case :

if case .move(let distance) = action {
    print("Moving: \(distance)") 
}

La sintaxis del guard case se puede utilizar para la extracción posterior del uso:

guard case .move(let distance) = action else {
    print("Action is not move")
    return
}

Las enumeraciones con valores asociados no son Equatable de forma predeterminada. La implementación del operador == debe hacerse manualmente:

extension Action: Equatable { }

func ==(lhs: Action, rhs: Action) -> Bool {
    switch lhs {
    case .jump: if case .jump = rhs { return true }
    case .kick: if case .kick = rhs { return true }
    case .move(let lhsDistance): if case .move (let rhsDistance) = rhs { return lhsDistance == rhsDistance }
    }
    return false
}