Dopo aver letto Come testare l'uguaglianza delle enumerazioni Swift con i valori associati , ho implementato la seguente enumerazione:
enum CardRank {
case Number(Int)
case Jack
case Queen
case King
case Ace
}
func ==(a: CardRank, b: CardRank) -> Bool {
switch (a, b) {
case (.Number(let a), .Number(let b)) where a == b: return true
case (.Jack, .Jack): return true
case (.Queen, .Queen): return true
case (.King, .King): return true
case (.Ace, .Ace): return true
default: return false
}
}
Il codice seguente funziona:
let card: CardRank = CardRank.Jack
if card == CardRank.Jack {
print("You played a jack!")
} else if card == CardRank.Number(2) {
print("A two cannot be played at this time.")
}
Tuttavia, questo non compila:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... e fornisce il seguente messaggio di errore:
L'operatore binario "==" non può essere applicato agli operandi di tipo "CardRank" e "(Int) -> CardRank"
Suppongo che ciò sia dovuto al fatto che si aspetta un tipo completo e CardRank.Number
non specifica un tipo intero, mentre lo ha CardRank.Number(2)
fatto. Tuttavia, in questo caso, voglio che corrisponda a qualsiasi numero; non solo uno specifico.
Ovviamente posso usare un'istruzione switch, ma il punto centrale dell'implementazione ==
dell'operatore era evitare questa soluzione prolissa:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
C'è un modo per confrontare un'enumerazione con i valori associati ignorando il suo valore associato?
Nota: mi rendo conto che potrei cambiare il caso nel ==
metodo in case (.Number, .Number): return true
, ma, anche se restituirebbe vero correttamente, il mio confronto sembrerebbe comunque essere confrontato con un numero specifico ( number == CardRank.Number(2)
; dove 2 è un valore fittizio) piuttosto che con qualsiasi numero ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
i casi nella==
realizzazione all'operatore di appena:case (let x, let y) where x == y: return true