如何用关联值测试Swift枚举的相等性
我想测试两个Swift枚举值的相等性。例如:
enum SimpleToken {    case Name(String)
    case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
XCTAssert(t1 == t2)
但是,编译器不会编译相等表达式:
error: could not find an overload for '==' that accepts the supplied arguments    XCTAssert(t1 == t2)
    ^~~~~~~~~~~~~~~~~~~
我是否定义了自己的等于运算符的重载?我希望Swift编译器能够自动处理它,就像Scala和Ocaml一样。
回答:
迅捷4.1+
正如@jedwid有用地指出的那样,从Swift
4.1开始(由于SE-0185,Swift还支持合成Equatable以及Hashable具有关联值的枚举。
因此,如果您使用的是Swift 4.1或更高版本,则以下内容将自动合成可行的必要方法XCTAssert(t1 ==
t2)。关键是将Equatable协议添加到您的枚举中。
enum SimpleToken: Equatable {    case Name(String)
    case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
在Swift 4.1之前
正如其他人指出的那样,Swift不会自动综合必要的相等运算符。不过,让我提出一个更清洁的(IMHO)实现:
enum SimpleToken: Equatable {    case Name(String)
    case Number(Int)
}
public func ==(lhs: SimpleToken, rhs: SimpleToken) -> Bool {
    switch (lhs, rhs) {
    case let (.Name(a),   .Name(b)),
         let (.Number(a), .Number(b)):
      return a == b
    default:
      return false
    }
}
这远非理想-重复很多-但至少您不需要在内部带有if语句的嵌套开关。
以上是 如何用关联值测试Swift枚举的相等性 的全部内容, 来源链接: utcz.com/qa/401581.html

