【问题标题】:Compare enums with associated values in Swift将枚举与 Swift 中的关联值进行比较
【发布时间】:2015-08-11 07:02:06
【问题描述】:

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

我的问题是我有很多这样的枚举和很多案例,所以我需要编写很多这样的比较代码(针对每个枚举,针对每个案例)。

如您所见,这段代码始终遵循相同的方案,因此似乎有一种更抽象的方式来实现比较行为。有没有办法解决这个问题?例如泛型?

【问题讨论】:

    标签: ios swift generics enums comparison


    【解决方案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))")
    

    即默认比较会考虑关联的值。

    【讨论】:

      【解决方案2】:

      目前如果不写出所有的案例是无法实现的,我们希望在以后的版本中可以实现。

      如果你真的有很多案例并且你不想把它们都写出来,你可以编写一个小函数来自动为你生成代码(我最近一直在这样做,因为它不是'无法重构)

      【讨论】:

        猜你喜欢
        • 2015-10-11
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2013-08-28
        相关资源
        最近更新 更多