在Swift中比较带有关联值的枚举

4

对于带有关联值的枚举类型,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
    }
}

我的问题是我有很多这样的枚举类型,每种枚举类型都有很多情况需要编写大量的比较代码(对于每个枚举类型,对于每个情况)。

正如你所看到的,这些代码总是遵循相同的模式,因此似乎存在更抽象的方式来实现比较行为。是否有一种方法解决这个问题?例如使用泛型?

2个回答

6
从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))")

即默认比较会考虑相关值。

3

目前没有办法在不写出所有情况的情况下实现这一点,我们希望在以后的版本中可能会有可能。

如果您真的有很多情况,并且不想将它们全部写出来,您可以编写一个小函数自动生成代码(最近我为无法重构的某些内容做了这个)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接