Swift Language Enum con valori associati


Esempio

I casi Enum possono contenere uno o più payload ( valori associati ):

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

Il payload deve essere fornito durante l'istanziazione del valore enum:

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

L'istruzione switch può estrarre il valore associato:

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

Un'estrazione caso singolo può essere eseguita utilizzando il if case :

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

La sintassi del guard case può essere utilizzata per l'estrazione successiva:

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

Le enumerazioni con valori associati non sono Equatable per impostazione predefinita. L'implementazione dell'operatore == deve essere eseguita 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
}