gpt4 book ai didi

swift - 如何测试 Swift 枚举与关联值的相等性

转载 作者:可可西里 更新时间:2023-10-31 23:13:41 25 4
gpt4 key购买 nike

我想测试两个 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 那样。

最佳答案

swift 4.1+

作为@jedwidz有帮助地指出,从 Swift 4.1 开始(由于 SE-0185,Swift 还支持为具有关联值的枚举合成 EquatableHashable

因此,如果您使用的是 Swift 4.1 或更新版本,以下内容将自动合成必要的方法,以便 XCTAssert(t1 == t2) 起作用。关键是将 Equatable 协议(protocol)添加到您的枚举中。

enum SimpleToken: Equatable {
case Name(String)
case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)

Swift 4.1 之前

正如其他人所指出的,Swift 不会自动合成必要的相等运算符。不过,让我提出一个更清洁的(恕我直言)实现方案:

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 - 如何测试 Swift 枚举与关联值的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com