如何绕过swift的要求,即切换默认语句必须是最后一个(在案例之后)



过去在所有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
}

最新更新