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