Swift 列挙順序と比較 質問する

Swift 列挙順序と比較 質問する

Swiftで列挙型を定義順に比較する方法に関するドキュメントを見つけるのに苦労しました。具体的には、次のような列挙型を作成するときです。

enum EnumType {
    case First,  Second, Third
}

Swiftでは、列挙型を順序で直接比較することはできません。

let type1 = EnumType.First
let type2 = EnumType.Second
if type1 < type2 {println("good")} // error

コンパイルエラー「{EnumType, EnumType}型の引数リストで '<' を呼び出すことはできません」が発生します。そのため、私が見つけた唯一の解決策は、次のように独自の比較演算子をオーバーロードとして記述することです。

enum EnumType : Int {
    case First = 0, Second, Third
}

func <(a: EnumType, b: EnumType) -> Bool {
    return a.rawValue < b.rawValue
}

let type1 = EnumType.First
let type2 = EnumType.Second
if type1 < type2 {println("good")} // Returns "good"

これは、アプリケーションで多くの用途と価値がある「重い」列挙型には適していますが、使用したいすべての演算子をオーバーロードすることは、単一の小さなモジュールのいくつかの定数に秩序をもたらすためにオンザフライで定義する可能性のある「軽い」列挙型にとっては過度の負担になるようです。

プロジェクトで定義するすべての列挙型に対して、大量の定型オーバーロード コードを記述せずにこれを行う方法はありますか? さらに良いことに、関連付けられた型を持たない単純な列挙型 (つまり、型指定されていないか Int として型指定されている) に対して比較演算子を Swift が自動的に提供するようにするために、何か見落としている点はありますか? Swift は Int を比較する方法を知っているのに、なぜ列挙型 Int を比較できないのでしょうか?

ベストアンサー1

列挙型に基礎となる型を指定すると、プロトコルに準拠しますRawRepresentable

つまり、次のように、生の表現が可能で比較可能な生の型を持つ任意の型に対して、汎用の比較演算子を記述できます。

func <<T: RawRepresentable where T.RawValue: Comparable>(a: T, b: T) -> Bool {
    return a.rawValue < b.rawValue
}

つまり、列挙型には自動的に演算<子が含まれることになります。

enum E: Int {  // this would work with Double and String also
    // btw, no need to give a seed value of 0,
    // that happens automatically for Ints
    case A, B, C, D, E
}

E.A < E.C  // returns true

唯一Comparable必要な定型的な作業は、次のような汎用アルゴリズムで enum を使用する場合に備えて、enum にタグを付けることです。

extension E: Comparable { }
// (no need for anything else - requirements are already fulfilled)

let a: [E] = [.C, .E, .A]
let b = sorted(a)
// b will now be [.A, .C, .E]

これを に準拠させると、、 および演算子Comparableも自動的に付与されます(標準ライブラリによって提供されます)。<=>>=

おすすめ記事