如果至少有一个具有关联值的案例,则无法比较两个枚举

问题描述 投票:1回答:3

假设我有:

enum Type {
    case A
    case B
}

现在我可以比较它们:

let enums = [Type.A, Type.B]

if enums[1] == Type.A {  //true }

一切都很好,除非我添加另一个具有相关值的案例:

case C(String)

现在我有一个错误:

二元运算符==不能应用于两个Type操作数。

怎么做才能使它工作?

swift enums swift2
3个回答
1
投票

不幸的是,从Xcode 7 beta 4开始,你必须自己实现自己的==函数,因为编译器不能再推断出相等的操作。特别是对于Type.C:它还应该检查相关值的相等性吗?

逻辑/静态实现的示例:

// comparing associated values
func ==(t1: Type, t2: Type) -> Bool {
    switch (t1, t2) {
    case (.A, .A): return true
    case (.B, .B): return true
    case (.C(let x), .C(let y)) where x == y: return true
    default: return false
    }
}

// without comparing
func ==(t1: Type, t2: Type) -> Bool {
    switch (t1, t2) {
    case (.A, .A): return true
    case (.B, .B): return true
    case (.C, .C): return true
    default: return false
    }
}

一种更简单的方法是将其转换为String(使用反射)。这将是一种动态的方法/解决方案,但它可能会随着时间而改变,特别是对于自己的类型(没有长期解决方案):

// you "have to" compare associated values
func ==(t1: Type, t2: Type) -> Bool {
    return String(t1) == String(t2)
}

0
投票

在Swift 4.2中很容易做到

enum SomeType: Equatable {
    case a
    case b
    case c(String)
}

let enums = [SomeType.a, SomeType.b, SomeType.c("Some string")]

if enums[1] == SomeType.b {  print("true") }

-2
投票

你必须为枚举类型实现func ==。 stackoverflow上有一些示例,向您展示如何使用每个案例的一行代码执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.