Swift 4 неисчерпывающий ключ компиляции - PullRequest
0 голосов
/ 26 января 2019

Насколько я понимаю, в swift оператор 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, Swift4.2

Я в замешательстве, потому что я не смог найти никакой информации о том, что операторы такого типа разрешены в swift.Как я могу заставить мой компилятор предупреждать меня, когда он встречает неисчерпывающий оператор switch?

...