Может ли быстрый переключатель быть исчерпывающим для типа Double без регистра по умолчанию? - PullRequest
0 голосов
/ 11 февраля 2019

Может ли быстрый переключатель быть исчерпывающим для типа Double без случая по умолчанию?

Этот переключатель (без случая по умолчанию) выдает ошибку: переключатель должен быть исчерпывающим:

    var minY = 1.0

    switch minY {
    case -(Double.infinity)..<0.9:
        yAxisMinimum = 0.0
    case (0.9..<0.99):
        yAxisMinimum = 0.9
    case (0.99..<0.999):
        yAxisMinimum = 0.99
    case (0.999..<0.9999):
        yAxisMinimum = 0.999
    case (0.9999...Double.infinity):
        yAxisMinimum = 0.9999
    }

Ноэтот переключатель с (бесполезным) регистром по умолчанию работает:

    var minY = 1.0

    switch minY {
    case -(Double.infinity)..<0.9:
        yAxisMinimum = 0.0
    case (0.9..<0.99):
        yAxisMinimum = 0.9
    case (0.99..<0.999):
        yAxisMinimum = 0.99
    case (0.999..<0.9999):
        yAxisMinimum = 0.999
    case (0.9999...Double.infinity):
        yAxisMinimum = 0.9999
    default:
        yAxisMinimum = 0.0
    }

Я стараюсь избегать случаев по умолчанию с моими коммутаторами, но не знаю, возможно ли это с двойным.

1 Ответ

0 голосов
/ 11 февраля 2019

Нет , поскольку только типы перечислений могут быть тщательно проверены .

Но в этом случае проблема еще глубже.Даже если бы целые числа могли быть исчерпывающе проверены, вы все же не могли бы исчерпывающе проверить Double без предложения where.Один из вариантов - .nan («не число»), который вы не рассматриваете.Поэтому вы можете просто добавить этот случай:

case .nan:
    yAxisMinimum = .nan

Мало того, что это не сделает его исчерпывающим, оно даже не будет работать так, как вы ожидаете.

var minY = Double.nan

switch minY {
case -(Double.infinity)..<0.9:
    yAxisMinimum = 0.0
// ...
case .nan:
    yAxisMinimum = .nan
default:
    yAxisMinimum = 0
}

yAxisMinimum // 0

Зачем?Из-за этого:

var minY = Double.nan
minY == .nan   // false

NaN не равно всему , включая NaN.Таким образом, нет способа включить его непосредственно в оператор switch.Вы должны использовать предложение where:

case _ where minY.isNaN:
    yAxisMinimum = .nan

И это определенно сверх способности компилятора проверять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...