Swift 带参数的枚举:如何比较它们?

Swift enums with arguments: how to compare them?

我有以下枚举:

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

我想知道如何编写 Equatable 函数,然后让我比较 Message 枚举。

我发现了一些关于堆栈溢出的类似问题,但我找不到一个可以让我进行比较而不必打开每个案例的问题。

有没有办法只编写一次 equatable 函数,即使我不断向该枚举中添加更多情况,它也能正常工作?

不可能编写一个适用于各种情况下所有枚举的函数。这基本上就是你想要的。

原因是讨论here。第二个答案显示了一种可以与具有 rawValue 的枚举一起使用的方法。

这是因为混合类型的枚举失去了原始值。

您可以编写一个开关来获取原始值(您必须忽略关联的值)。但这不能自动完成。

对于 Struct 或 Class,您也无法编写自动创建其中声明的所有 var 的 sequence/set 的方法。就像枚举无法从它的案例中做出 sequence/set 一样。

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)

}