不知道是编译器的错误还是有什么我不知道的。
在匹配具体类型时,我可以结合两种情况,例如:
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/