How to compare Swift enum with associated values by ignoring its associated value? Ask Question

How to compare Swift enum with associated values by ignoring its associated value? Ask Question

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
}

冗長性を避けたい場合は、isNumberswitch ステートメントを実装する列挙型に計算プロパティを追加することを検討してください。

おすすめ記事