我可以使用模式匹配运算符 ~= 将枚举值与具有关联变量的枚举类型匹配吗?

Can I use the pattern matching operator ~= to match an enum value to an enum type with an associated variable?

我想在不使用 switch 的情况下将枚举值与枚举类型进行比较。例如,以下代码使用 ~= 运算符:

enum MyEnum {
    case A, B
}

let myEnum = MyEnum.A

let isA = myEnum ~= MyEnum.A

isA等于上面的true

但是,当我尝试将枚举类型的枚举与关联值进行比较时,如下所示,出现编译错误 Binary operator '~=' cannot be applied to two MyEnum operands

enum MyEnum {
    case A, B(object: Any)
}

let myEnum = MyEnum.A

let isA = myEnum ~= MyEnum.A

有没有办法解决此错误以使用 ~= 模式匹配运算符?或者我唯一的办法是使用以下语法,在我看来这要麻烦得多:

enum MyEnum {
    case A, B(object: Any)
}

let myEnum = MyEnum.A

let isA: Bool
switch myEnum {
case .A:
    isA = true
default:
    isA = false
}

提前感谢您的意见和建议!

来自 Swift 1.2 "Enumeration case patterns appear only in switch statement case labels" 的文档。所以是的,您需要定义 ~= 运算符(根据评论中指出的答案)。

如果您只需要 isAisB,您可以使用 switch 结合 _ 来实现它们。在您的情况下,~= 无论如何都无法 开箱即用 ,因为您使用的是 Any 关联类型,而不是 Equatable(即: 我怎么能说两个 .B(any) 是否相等,因为我不能说两个是否相等?)

例如,这是使用 String 作为关联类型的代码的实现。如果您只需要 isAisB,您仍然可以使用 Any 作为关联类型而无需实现 ~= 运算符。

enum MyEnum {
    case A, B(object: String)
}

let myEnumA = MyEnum.A
let myEnumB = MyEnum.B(object: "Foo")


func ~=(lhs: MyEnum, rhs: MyEnum) -> Bool {
    switch (lhs, rhs) {
    case (.A, .A):
        return true
    case let (.B(left), .B(right)):
        return left == right
    default:
        return false
    }
}

myEnumA ~= .A   // true
myEnumB ~= .B(object: "Foo") // true
myEnumB ~= .B(object: "Bar") // false

func isA(value: MyEnum) -> Bool {
    switch value {
    case .A:
        return true
    default:
        return false
    }
}

func isB(value: MyEnum) -> Bool {
    switch value {
    case .B(_):     // Ignore the associated value
        return true
    default:
        return false
    }
}