Après avoir lu Comment tester l'égalité des énumérations Swift avec les valeurs associées , j'ai implémenté l'énumération suivante:
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
}
}
Le code suivant fonctionne:
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.")
}
Cependant, cela ne compile pas:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... et il donne le message d'erreur suivant:
L'opérateur binaire '==' ne peut pas être appliqué aux opérandes de type 'CardRank' et '(Int) -> CardRank'
Je suppose que c'est parce qu'il attend un type complet et CardRank.Number
ne spécifie pas un type entier, alors qu'il l'a CardRank.Number(2)
fait. Cependant, dans ce cas, je veux qu'il corresponde à n'importe quel nombre; pas seulement un spécifique.
Évidemment, je peux utiliser une instruction switch, mais le but de l'implémentation de l' ==
opérateur était d'éviter cette solution verbeuse:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
Existe-t-il un moyen de comparer une énumération avec les valeurs associées tout en ignorant sa valeur associée?
Remarque: je me rends compte que je pourrais changer la casse de la ==
méthode en case (.Number, .Number): return true
, mais, même si elle retournerait vrai correctement, ma comparaison ressemblerait toujours à un nombre spécifique ( number == CardRank.Number(2)
; où 2 est une valeur fictive) plutôt qu'à n'importe quel nombre ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
cas dans la==
mise en œuvre de l' opérateur juste:case (let x, let y) where x == y: return true