不知道它是编译器中的错误还是我不知道的东西。
当与具体类型匹配时,我可以结合两种情况,如:
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")
}
有人可以告诉我它为什么会这样吗?
答案 0 :(得分:0)
稍微弄清楚这一点。
我非常肯定param
施放到equatable是非常无用的,不能以任何方式使用。我很惊讶它的工作原理,因为它需要Self
并且在转换为普通变量时不起作用。
我猜测编译器不应该能够 这些,但是你的第二个例子无论是意外还是旧方法的残余都可以。 (作为旁注,Switch模式匹配应该进行大修,因此很快就会产生正确的编译错误。)。
我在想第一个不起作用的原因与使用多选项开关案例变量(这是一个满嘴)时定义变量的方式有关。如果它试图将Equatable
的两个不同实例设置为同一个变量,则基础类型可能是两个不同的类型,它甚至不能尝试,但如果它尝试,就像它在这里一样,它在内部打破了一些东西。
我的猜测是已经为Swift 4报告或修复过了,但在Swift bug tracker上提交雷达和/或报告并没有什么坏处: