一个Swift的switch语句对于Double类型是否可以不需要default case就能够完全穷尽所有情况?

8

一个没有默认情况的快速开关是否可以对双精度类型进行详尽说明?

这个(没有默认情况的)开关会报错:开关必须是详尽的:

    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
    }

我尽量避免在switch语句中使用默认情况,但不确定在Double类型中是否可行。


你的第一个 switch 没有覆盖到所有情况。你还需要处理 NaN 。(虽然我不知道这是否会解决编译器错误。) - user1118321
1
你还没有处理过无穷大的情况。无论如何,我认为编译器没有检查整数/双精度的完整性。 - Alexander
2
不相关的内容:-(Double.infinity)..<0.9 可以写成 ..<0.9 - ielyamani
你可以使用 case _: 来匹配任何内容,从而避免使用 default。但我知道这也不是你想要的。 - vacawama
2
可能是Swift中switch case的穷尽条件的重复。 - ielyamani
1个回答

11

不能使用因为只有枚举类型可以被完全检查

但是,在这种情况下,问题更加深刻。即使可以完全检查整数,没有where子句,仍然无法完全检查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

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


Rob - 你的回答提出了一个很好的观点,但是在Swift中肯定有其他不需要默认值的东西。这里有一个直接来自参考手册(5.1)的例子:let anotherPoint = (2, 0) switch anotherPoint { case (let x, 0): print("在x轴上,x值为(x)") case (0, let y): print("在y轴上,y值为(y)") case let (x, y): print("在其他地方((x), (y))") } // 输出 "在x轴上,x值为2" - cdeerinck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接