Nachdem ich gelesen habe, wie man die Gleichheit von Swift-Aufzählungen mit zugehörigen Werten testet , habe ich die folgende Aufzählung implementiert:
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
}
}
Der folgende Code funktioniert:
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.")
}
Dies wird jedoch nicht kompiliert:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... und es wird folgende Fehlermeldung angezeigt:
Der Binäroperator '==' kann nicht auf Operanden vom Typ 'CardRank' und '(Int) -> CardRank' angewendet werden.
Ich gehe davon aus, dass dies daran liegt, dass ein vollständiger Typ erwartet wird und CardRank.Number
nicht der gesamte Typ angegeben wird, wohingegen CardRank.Number(2)
dies der Fall ist . In diesem Fall möchte ich jedoch, dass es mit einer beliebigen Zahl übereinstimmt . nicht nur eine bestimmte.
Natürlich kann ich eine switch-Anweisung verwenden, aber der Sinn der Implementierung des ==
Operators bestand darin, diese ausführliche Lösung zu vermeiden:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
Gibt es eine Möglichkeit, eine Aufzählung mit zugeordneten Werten zu vergleichen, während der zugehörige Wert ignoriert wird?
Hinweis: Mir ist klar, dass ich den Fall in der ==
Methode in ändern könnte case (.Number, .Number): return true
, aber obwohl er korrekt zurückgegeben wird, sieht mein Vergleich immer noch so aus, als würde er mit einer bestimmten Zahl ( number == CardRank.Number(2)
wobei 2 ein Dummy-Wert ist) und nicht mit einer beliebigen Zahl verglichen ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
Fälle in der==
Operatorimplementierung nur:case (let x, let y) where x == y: return true