对于具有关联值的枚举,Swift不提供相等运算符。所以我实现了一个能够比较两个枚举:
enum ExampleEnum{
case Case1
case Case2(Int)
case Case3(String)
...
}
func ==(lhs: ExampleEnum, rhs: ExampleEnum) -> Bool {
switch(lhs, rhs){
case (.Case1, .Case1): return true
case let (.Case2(l), .Case2(r)): return l == r
case let (.Case3(l), .Case3(r)): return l == r
...
default: return false
}
}
我的问题是我有很多这样的枚举,因此我需要编写大量的比较代码(针对每个枚举,针对每种情况)。
如您所见,此代码始终遵循相同的方案,因此似乎有一种更抽象的方式来实现比较行为。有没有办法解决这个问题?例如,使用泛型?
答案 0 :(得分:3)
目前在没有写出所有案例的情况下无法实现这一目标,我们希望在以后的版本中可以实现。
如果你真的有很多案例并且你不想全部写出来,你可以编写一个小函数来自动为你生成代码(我最近一直在这样做,因为它不是'可能重构)
答案 1 :(得分:1)
从Swift 4.2开始,只需添加Equatable
协议一致性即可。
它会自动实施。
enum ExampleEquatableEnum: Equatable {
case case1
case case2(Int)
case case3(String)
}
print("ExampleEquatableEnum.case2(2) == ExampleEquatableEnum.case2(2) is \(ExampleEquatableEnum.case2(2) == ExampleEquatableEnum.case2(2))")
print("ExampleEquatableEnum.case2(1) == ExampleEquatableEnum.case2(2) is \(ExampleEquatableEnum.case2(1) == ExampleEquatableEnum.case2(2))")
即默认比较会考虑相关值。