过去在所有C变体中都能正常工作的典型代码但不知何故,在swift这个勇敢的新世界里已经不够好了:
@Environment(.colorScheme) var colorScheme
var body: some View
{
var multiplier: CGFloat
switch(colorScheme)
{
@unknown default:
assertionFailure()
fallthrough
case .light:
multiplier = 0.3
case .dark:
multiplier = 0.1
fallthrough
}
我该如何重写它,使swift编译器不会抱怨?
作为权宜之计,我做了
switch(colorScheme)
{
case .light:
multiplier = 0.3
case .dark:
multiplier = 0.1
@unknown default:
preconditionFailure()
}
为了满足default
排在最后的要求显然不是我想要的语义。
我希望代码在调试构建中爆炸,并在发布案例,以便代码在现场工作。
您可以尝试:
switch colorScheme {
case .dark:
multiplier = 0.1
case .light:
fallthrough
@unknown default:
assertionFailure("unknown colorScheme (colorScheme)")
multiplier = 0.3
}
尽管我个人认为使用会更清楚
switch colorScheme {
case .dark:
multiplier = 0.1
case .light:
multiplier = 0.3
@unknown default:
assertionFailure("unknown colorScheme (colorScheme)")
multiplier = 0.3
}
在第二个示例中,您不使用fallthrough
,从而打破了.light
状态的作用和默认的未来未知colorScheme
作用之间的任何依赖关系(尽管到目前为止,它使用与灯光方案相同的multiplier
(。
在我工作的商店里,它会被认为是";Swiftier";(即更能表达意图,从而以斯威夫特的设计精神进行编码(以后一种方式写作。
因为默认值排在最后,所以公共逻辑必须排在后面…
let multiplier: Double = {
switch colorScheme {
case .light:
break
case .dark:
return 0.1
@unknown default:
assertionFailure()
}
return 0.3
} ()
…或在早期定义并在以后的用法中引用。
let multiplier: Double
let lightMultiplier = 0.3
switch colorScheme {
case .light:
multiplier = lightMultiplier
case .dark:
multiplier = 0.1
@unknown default:
assertionFailure()
multiplier = lightMultiplier
}