2
如何在case
具有关联值时测试枚举相等性?一个人为的例子:测试枚举for for equal for for ... where子句
enum Status : Equatable {
case success
case failed(error: String)
static func == (lhs: Status, rhs: Status) -> Bool {
switch (lhs, rhs) {
case (.success, .success), (.failed, .failed):
return true
default:
return false
}
}
}
let statuses = [
Status.success,
.failed(error: "error 1"),
.failed(error: "error 2"),
.success
]
// Failed: Binary operator '==' cannot be applied to operands of type 'Status' and '_'
for s in statuses where s == .failed {
print(s)
}
(我知道我可以测试s != .success
,但实际的枚举具有更多的情况下,所以他们是一个麻烦)
因为你认为任何'失败'等于另一个(这很奇怪;如果'error'是相同的,通常它们是相同的),你可以在s ==的状态下执行s。失败(错误:“”){...}'。请注意,使用'if',你可以做'if case',例如'如果case .failed = someStatus {...}'。 – Rob
如果你不介意在过程中提取关联的值,你可以在case {fa(let)str){print(“failure:\(str)”)}'中做。 – vacawama
这在某种程度上是开玩笑的,但它确实有效:'用于在zip(状态,状态){print(s)}'情况下(.failed,let s)''。 – vacawama