如何使用关联值测试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一样。


郎朗坤
浏览 1038回答 3
3回答

慕桂英4014372

正如其他人指出的那样,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语句里面。
打开App,查看更多内容
随时随地看视频慕课网APP