在没有默认情况下,快速开关是否可以穷尽Double类型?

时间:2019-02-10 23:28:57

标签: swift switch-statement

对于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
    }

我尝试避免开关出现默认情况,但不知道Double开关是否可行。

1 个答案:

答案 0 :(得分:9)

because only enum types can be exhaustively checked

但是在这种情况下,问题更加严重。即使可以详尽地检查Integer,但是如果没有where子句,您 still 也无法详尽地检查Double。选项之一是.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

这绝对是超出了编译器的验证能力。