Depois de ler Como testar a igualdade de enums do Swift com valores associados , implementei o seguinte enum:
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
}
}
O seguinte código funciona:
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.")
}
No entanto, isso não compila:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... e dá a seguinte mensagem de erro:
O operador binário '==' não pode ser aplicado a operandos do tipo 'CardRank' e '(Int) -> CardRank'
Estou supondo que isso ocorre porque ele está esperando um tipo completo e CardRank.Number
não especifica um tipo inteiro, enquanto o CardRank.Number(2)
fazia. No entanto, neste caso, quero que corresponda a qualquer número; não apenas um específico.
Obviamente, posso usar uma instrução switch, mas o objetivo principal da implementação do ==
operador era evitar esta solução detalhada:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
Existe alguma maneira de comparar um enum com valores associados enquanto ignora seu valor associado?
Observação: eu percebo que poderia alterar o caso no ==
método para case (.Number, .Number): return true
, mas, embora retornasse verdadeiro corretamente, minha comparação ainda pareceria estar sendo comparada a um número específico ( number == CardRank.Number(2)
; onde 2 é um valor fictício) em vez de qualquer número ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
casos na==
implementação operador apenas:case (let x, let y) where x == y: return true