Swift模式与协议匹配

时间:2017-06-02 12:15:47

标签: swift pattern-matching protocols

不知道它是编译器中的错误还是我不知道的东西。

当与具体类型匹配时,我可以结合两种情况,如:

    enum SomeEnum {
        case a, b, c
    }

    let param: (SomeEnum, Any) = something
    switch (param) {
        case (.a, let param as Int),
             (.b, let param as Int):
            print("a or b with solid type (Int) \(param)")
        default: print("none of above")
    }

但是,如果我想与以下协议匹配:

    switch (param) {
        case (.a, let param as Equatable),
             (.b, let param as Equatable):
            print("a or b with protocol \(param)")
        default: print("none of above")
    }

我在编译期间得到Segmentation fault: 11。解决方案是复制代码,如:

    switch (param) {
        case (.a, let param as Equatable):
            print("a or b with protocol \(param)")
         case (.b, let param as Equatable):
            print("a or b with protocol \(param)")
        default: print("none of above")
    }

有人可以告诉我它为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

稍微弄清楚这一点。

我非常肯定param施放到equatable是非常无用的,不能以任何方式使用。我很惊讶它的工作原理,因为它需要Self并且在转换为普通变量时不起作用。

我猜测编译器不应该能够 这些,但是你的第二个例子无论是意外还是旧方法的残余都可以。 (作为旁注,Switch模式匹配应该进行大修,因此很快就会产生正确的编译错误。)。

我在想第一个不起作用的原因与使用多选项开关案例变量(这是一个满嘴)时定义变量的方式有关。如果它试图将Equatable的两个不同实例设置为同一个变量,则基础类型可能是两个不同的类型,它甚至不能尝试,但如果它尝试,就像它在这里一样,它在内部打破了一些东西。

我的猜测是已经为Swift 4报告或修复过了,但在Swift bug tracker上提交雷达和/或报告并没有什么坏处: