为什么这个带两个枚举的Swift switch语句不完全?
我写了一些Swift代码(Swift 3.1,Xcode 8.3.2),它打开了两个枚举。 我相信我已经写了一份详尽的案例列表,但编者不同意我的看法。 我的代码有点复杂,有一些相关的值,所以我把它简化为一个简单的例子,就像我在操场上可以这样做的一样:
enum Test {
case one
case two
case three
case four
}
let allValues: [Test] = [.one, .two, .three, .four]
let test1 = Test.one
let test2 = Test.two
for i in 0..<4 {
for j in 0..<4 {
let test1 = allValues[i]
let test2 = allValues[j]
switch (test1, test2) {
case (.one, _):
print("one, _")
case (_, .one):
print("_, one")
case (.two, _):
print("two, _")
case (_, .two):
print("_, two")
case (.three, .three):
print("three, three")
case (.three, .four):
print("three, four")
case (.four, .three):
print("four, three")
case (.four, .four):
print("four, four")
//Won't compile with this commented out, but when enabled,
//we never print out "default"
// default:
// print("default")
}
}
}
打印出来:
one, _
one, _
one, _
one, _
_, one
two, _
two, _
two, _
_, one
_, two
three, three
three, four
_, one
_, two
four, three
four, four
我希望这可以在没有默认子句的情况下编译,但是编译器会给出“错误:开关必须是详尽的,考虑添加一个默认子句”。 如果我添加默认子句,它编译并运行良好,但它当然不会碰到默认子句,因为所有先前的case语句处理这两个枚举的每个变体。
默认的子句并没有真正伤害任何东西,但我真的很想明白为什么这个开关不被编译器认为是详尽的。 有任何想法吗?
在Twitter上,CodaFi向我指出了以下内容,这表明这是Swift编译器当前版本中的一个缺陷/缺点。
https://bugs.swift.org/browse/SR-483
https://bugs.swift.org/browse/SR-1313
链接地址: http://www.djcxy.com/p/88663.html上一篇: Why is this Swift switch statement with two enums not exhaustive?
下一篇: Java switch over an enum does not detect that all cases are covered