After reading How to test equality of Swift enums with associated values, I implemented the following 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
}
}
The following code works:
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.")
}
However, this doesn't compile:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
... and it gives the following error message:
Binary operator '==' cannot be applied to operands of type 'CardRank' and '(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
)。
ベストアンサー1
Swift 2 以降では、パターン マッチを使用できますif-case
。
let number = CardRank.Number(5)
if case .Number = number {
// Is a number
} else {
// Something else
}
冗長性を避けたい場合は、isNumber
switch ステートメントを実装する列挙型に計算プロパティを追加することを検討してください。