对于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开关是否可行。
答案 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
这绝对是超出了编译器的验证能力。