我正在编写一些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
我希望这可以在没有default子句的情况下进行编译,但是编译器会给出&#34;错误:switch必须是详尽的,考虑添加一个默认子句&#34;。如果我添加默认子句,它编译并运行正常,但当然它永远不会遇到默认子句,因为所有先前的case语句都处理两个枚举的每个变体。
默认条款并不会对任何事情造成任何伤害,但我真的很想理解为什么编译器认为这个开关并不详尽。有什么想法吗?
答案 0 :(得分:5)
在Twitter上,CodaFi pointed me towards以下内容,表明当前版本的Swift编译器存在错误/缺点。