为什么这个带有两个枚举的Swift switch语句并不详尽?

时间:2017-04-24 21:36:02

标签: swift enums switch-statement

我正在编写一些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语句都处理两个枚举的每个变体。

默认条款并不会对任何事情造成任何伤害,但我真的很想理解为什么编译器认为这个开关并不详尽。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

在Twitter上,CodaFi pointed me towards以下内容,表明当前版本的Swift编译器存在错误/缺点。

https://bugs.swift.org/browse/SR-483

https://bugs.swift.org/browse/SR-1313