可以将Enum值与'比较'声明?

时间:2018-06-15 01:47:12

标签: swift enums compare

我创建了一个枚举类型(Swift 4.0):

enum TraceResult{
    case nothing
    case success
    case failed
    case custom(String)   //#1
}

之后我决定比较两个枚举值:

let tr = TraceResult.nothing
if tr == TraceResult.success{    //#2
    //do something...
}

并且编译器会在第2行中抱怨错误:

  

二元运算符' =='无法应用于两个TraceResult'操作数

如果我删除第1行,那就没关系!!!

或者我使用了' switch'声明来比​​较它们,它也没关系!!!

因此可以比较两个TraceResult值和'如果'语句???

谢谢;)

2 个答案:

答案 0 :(得分:2)

您需要为您的类型声明符合Equatable

enum TraceResult: Equatable {
    case nothing
    case success
    case failed
    case custom(String)
}

从Swift 4.1开始,编译器会自动为您合成==函数的定义。在4.1之前,您需要手动实现,如下所示:

extension TraceResult: Equatable {
    static func == (lhs: TraceResult, rhs: TraceResult) -> Bool {
        switch (lhs, rhs) {
            case (.nothing, .nothing): return true
            case (.success, .success): return true
            case (.failed, .failed): return true
            case (.custom(let s1), .custom(let s2)) where s1 == s2: return true

            case _: return false
        }
    }
}

答案 1 :(得分:1)

if case可用于比较枚举值。

您使用

if case .success = tr {
    // do something
}

而不是您当前正在进行的==比较。