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

带参数的Swift枚举:如何比较它们?,swift,enums,equatable,Swift,Enums,Equatable,我有以下枚举: enum Message: ErrorType { case MessageWithInfo(info:String?) case MessageDidFail case MessageDidSend(info:String) case InvalidMessageData case MessageWithDelay(delay:Double) .... will keep adding more } 我试图找出如何编写Equat

我有以下枚举:

enum Message: ErrorType {
    case MessageWithInfo(info:String?)
    case MessageDidFail
    case MessageDidSend(info:String)
    case InvalidMessageData
    case MessageWithDelay(delay:Double)
    .... will keep adding more
}
我试图找出如何编写Equatable函数,以便比较消息枚举

我在堆栈溢出上发现了一些类似的问题,但我找不到一个可以让我在不打开每个案例的情况下进行比较的问题


是否有一种方法可以编写一次Equalable函数,即使我不断向该枚举中添加更多事例,也可以使其工作?

不可能编写一个函数来处理所有事例的所有枚举。这基本上就是你想要的

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

这是因为混合类型的枚举会丢失其原始值

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

对于结构或类,您也不能编写一个方法来自动创建其中声明的所有var的序列/集合。就像枚举无法对其案例进行排序/设置一样

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)

}

对于具有关联值的枚举,必须显式地实现==自己。这意味着你必须打开每一个可能的案例。我认为没有办法解决这个问题。可能是重复的。