Swift 4非穷举开关编译

时间:2019-01-26 04:13:25

标签: swift enums compiler-errors switch-statement runtime-error

据我了解,不应该穷举且没有默认情况的switch语句。我正在计划使用此功能,因为我有一个包含很多情况的枚举,而且我喜欢让编译器将我定向到每个添加条件时都必须更新的switch语句。

enum Scalar {
    case unhandled
    case handled
    indirect case third(Vector2)
    indirect case fourth(Vector2,Vector2)
}
enum Vector2 {
    case handled(Scalar,Scalar)
    indirect case unhandled(Scalar,Vector2)
}
extension Scalar {
    func eval() -> Int {
        switch self {
        case .handled: return 1
        case .third: return 2
        }
    }
}
extension Vector2 {
    func eval() -> (Int,Int) {
        switch self {
        case .handled: return (3,6)
        }
    }
}
let g = Scalar.handled
print(g.eval())
let h = Scalar.unhandled
print(h.eval())

但是,事实证明,尽管大多数switch语句在未穷尽时都无法编译,但是当切换我的枚举时,非穷尽的开关将编译,甚至不会发出警告。在运行时,如果开关被其中一种情况未处理的枚举击中,则会引发运行时错误。

Thread 1: Fatal error: unexpected enum case while switching on value of type 'Scalar'

我正在使用OSX 10.14.2,Xcode 10.1,Swift 4.2

我很困惑,因为我无法迅速找到有关这种switch语句的任何信息。当编译器遇到非详尽的switch语句时,如何警告我?

0 个答案:

没有答案