与协议的快速模式匹配

问题描述:

不知道它是编译器中的错误还是有些我不知道的东西。与协议的快速模式匹配

当针对具体类型匹配,我可以合并两个情况下,像:

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

有人可以告诉我为什么它的行为是这样吗?

+2

一个崩溃的编译器是*始终*的错误。 –

+1

segfault是一个编译器错误。 https://bugs.swift.org/secure/Dashboard.jspa或https://bugreport.apple.com/为了好玩,你也可以贡献于https://github.com/practicalswift/swift-compiler-crashes –

+0

作为一个稍微好一点的解决方法,你可以在第一种情况下使用'fallthrough'。 –

这个有点混乱。

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

我猜编译器不应该能够这样做或者,但你的第二个例子偶然地或者作为旧方法的补充。 (作为一个方面说明,Switch模式匹配是由于大修,所以这可能会很快产生适当的编译器错误。)。

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

我的猜测是这已经报道或固定雨燕4,但它不会伤害到文件的雷达和/或在Swift bug tracker报告: