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

时间:2015-05-15 03:32:37

标签: swift enums pattern-matching

我想在不使用switch的情况下将枚举值与枚举类型进行比较。例如,以下代码使用AnimationFrame(){ mouseX = ( event.clientX - windowHalfX ) / resistanceh; mouseY = ( event.clientY - windowHalfY ) / resistancew; 运算符:

~=

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 模式匹配运算符?或者是我唯一可以使用以下语法的语言,我认为这种语法更加繁琐:

~=

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

1 个答案:

答案 0 :(得分:2)

从Swift 1.2 的文档中,“枚举案例模式仅出现在switch语句案例标签”中。所以是的,你需要定义你的~=运算符(从注释中指出的答案)。

如果您只需要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
    }
}