我能使用模式匹配运算符~=将一个枚举值与带有关联变量的枚举类型进行匹配吗?

4
我想比较一个枚举值与一个枚举类型,但不使用 switch 语句。例如,以下代码可以使用 ~= 运算符完成:
enum MyEnum {
    case A, B
}

let myEnum = MyEnum.A

let isA = myEnum ~= MyEnum.A

isA等于true

然而,当我尝试比较一个带有相关值的枚举类型的枚举时(如下所示),我会得到编译错误二进制运算符'~='不能应用于两个MyEnum操作数

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
}

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

1个回答

3
从Swift 1.2的文档中可以看出,"枚举案例模式仅出现在switch语句的case标签中"。因此,是的,您需要定义您的~=运算符(如评论中所指出的答案)。
如果您只需要isA和isB,那么可以使用switch与_结合实现它们。在您的情况下,~=无法正常工作,因为您使用了Any关联类型,而Any不可比较(即:我如何判断两个.B(any)是否相等,因为我无法判断两个任意值是否相等?)
以下是一个使用String作为关联类型的代码实现示例。如果您只需要isA和isB,则仍然可以使用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
    }
}

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