与协议(protocol)的 Swift 模式匹配

标签 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")
    }

但是,如果我想匹配如下协议(protocol):

    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")
    }

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

最佳答案

有点搞砸了。

我很确定将 param 转换为 equatable 几乎没有用,不能以任何方式使用。我很惊讶它能正常工作,因为它需要 Self 并且在转换为普通变量时不起作用。

我猜编译器不应该能够执行其中的任一个,但您的第二个示例要么是意外运行的,要么是旧方法的残余。 (附带说明一下,Switch 模式匹配将进行大修,因此这可能很快会产生正确的编译器错误。)。

我在想第一个不起作用的原因与使用多选项 switch case 变量时定义变量的方式有关(那是满嘴的)。如果它试图将 Equatable 的两个不同实例设置为同一个变量,则底层类型可能是两种不同的类型,它甚至不应该尝试,但如果它尝试了,因为它在这里,它在内部破坏了一些东西。

我的猜测是 Swift 4 已经报告或修复了这个问题,但是在 Swift bug tracker 上提交雷达和/或报告不会有什么坏处。 :

关于与协议(protocol)的 Swift 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328735/

相关文章:

bash - awk 只打印 (0, 1) if pattern,但我想打印模式

arrays - Swift 2.2 数组符合协议(protocol)

swift - 为什么 Swift 中的赋值不会发生?

swift - 如何在现有场景中添加 Sprite

ios - ipa 应用程序无法添加到我们的 itunes 库,它不是一个有效的应用程序

haskell - Haskell 守卫/模式匹配什么时候被认为是不详尽的?

带有 Protocol.Type 的 Swift 泛型

xcode - 使用 TabBar 和 NavBar 在 App Delegate 中配置窗口

ios - 从 Swift 函数中的异步调用返回数据

pattern-matching - 如果无序列表中的两个值相同则匹配