3

私は次の列挙型を持っています:

enum Message: ErrorType {
    case MessageWithInfo(info:String?)
    case MessageDidFail
    case MessageDidSend(info:String)
    case InvalidMessageData
    case MessageWithDelay(delay:Double)
    .... will keep adding more
}

メッセージ列挙型を比較できる Equatable 関数を作成する方法を見つけようとしています。

スタック オーバーフローに関する同様の質問をいくつか見つけましたが、すべてのケースをオンにしなくても比較できるような質問は見つかりませんでした。

この列挙型にさらにケースを追加し続けても、equatable 関数を 1 回記述して機能させる方法はありますか?

4

1 に答える 1

5

すべての種類のケースですべての列挙型に対して機能する 1 つの関数を作成することはできません。これは基本的にあなたが望むものです。

その理由はここで議論されています。2 番目の回答は、rawValue を持つ列挙型で使用できるメソッドを示しています。

これは、混合型の Enum が rawValue を失うためです。

rawValue を取得するスイッチを作成できます (関連する値を無視する必要があります)。しかし、これは自動的に行うことはできません。

Struct または Class では、宣言されたすべての var の let のシーケンス/セットを自動的に作成するメソッドを作成することもできません。列挙型がそのケースからシーケンス/セットを作成できないのと同じように。

enum Message: ErrorType {

    case MessageWithInfo(info:String?)
    case MessageDidFail
    case MessageDidSend(info:String)
    case InvalidMessageData
    case MessageWithDelay(delay:Double)

    var rawValue : Int {
        get {
            switch self {
            case .MessageWithInfo(info: _) : return 0
            case .MessageDidFail : return 1
            case .MessageDidSend(info: _) : return 2
            case .InvalidMessageData : return 3
            case .MessageWithDelay(delay: _) : return 4

            }
        }
    }
}

func ==(lhs:Message,rhs:Message) -> Bool {

    return (lhs.rawValue == rhs.rawValue)

}
于 2015-11-06T22:59:29.110 に答える