Прочитавши Як перевірити рівність перелічень 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
, але, хоча це поверне істину правильно, моє порівняння все одно буде виглядати як його порівняння з певним числом ( number == CardRank.Number(2)
; де 2 - фіктивне значення), а не з будь-яким числом ( number == CardRank.Number
).
Jack
,Queen
,King
,Ace
випадки в==
реалізації оператора просто:case (let x, let y) where x == y: return true