与协议的快速模式匹配
问题描述:
不知道它是编译器中的错误还是有些我不知道的东西。与协议的快速模式匹配
当针对具体类型匹配,我可以合并两个情况下,像:
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")
}
有人可以告诉我为什么它的行为是这样吗?
答
这个有点混乱。
我很确定param
转换为equatable几乎是无用的,不能以任何方式使用。我很惊讶它的工作原理,因为它需要Self
,并且在转换为普通变量时不起作用。
我猜编译器不应该能够这样做或者,但你的第二个例子偶然地或者作为旧方法的补充。 (作为一个方面说明,Switch模式匹配是由于大修,所以这可能会很快产生适当的编译器错误。)。
我在想第一个不起作用的原因与使用多选项开关大小写变量(这是满嘴的)时定义变量的方式有关。如果它试图将Equatable
的两个不同实例设置为同一个变量,则底层类型可能是两种不同的类型,它甚至不应该尝试,但如果它尝试,就像它在这里一样,它会在内部破坏某些东西。
我的猜测是这已经报道或固定雨燕4,但它不会伤害到文件的雷达和/或在Swift bug tracker报告:
一个崩溃的编译器是*始终*的错误。 –
segfault是一个编译器错误。 https://bugs.swift.org/secure/Dashboard.jspa或https://bugreport.apple.com/为了好玩,你也可以贡献于https://github.com/practicalswift/swift-compiler-crashes –
作为一个稍微好一点的解决方法,你可以在第一种情况下使用'fallthrough'。 –