После чтения Как проверить равенство перечислений Swift со связанными значениями, я выполнил следующее перечисление:
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
}
}
Работает следующий код:
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.")
}
Однако это не скомпилируется:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... и появляется следующее сообщение об ошибке:
Двоичный оператор '==' не может применяться к операндам типа "CardRank" и "(Int) → CardRank"
Я предполагаю, что это потому, что он ожидает полного типа, а CardRank.Number
не задает целостный тип, тогда как CardRank.Number(2)
. Однако в этом случае я хочу, чтобы он соответствовал любому; не только конкретный.
Очевидно, я могу использовать оператор switch, но вся цель реализации оператора ==
заключалась в том, чтобы избежать этого подробного решения:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
Есть ли способ сравнить перечисление со связанными значениями при игнорировании его связанного значения?
Примечание: Я понимаю, что я могу изменить случай в методе ==
на case (.Number, .Number): return true
, но, хотя он вернет true правильно, мое сравнение будет по-прежнему выглядеть как его сравнение с определенное число (number == CardRank.Number(2)
, где 2 - фиктивное значение), а не любое число (number == CardRank.Number
).