目前我有这个:
let somePoint = (1, 0)
switch somePoint {
case (0,0):
print("origin") // does not print
fallthrough
case (_, 0):
print("y-axis") // prints y-axis. this makes sense
fallthrough
case(0, _):
print("x-axis") // prints x-axis (because of fallthrough? this should not print)
fallthrough
case(-2...2, -2...2):
print("in 5x5 box about the origin") // this prints and makes sense
default:
print("somewhere else") // does not print
}
我使用此 switch 语句的目标是在每个案例为真时打印每个案例,而不是只打印第一个匹配的案例。我以为我可以用 fallthrough 语句来做到这一点。然而,这让我质疑它是如何工作的。为什么即使大小写不匹配,fallthrough 也会自动打印下一个大小写?我怎样才能让这个 switch 语句按照我想要的方式工作?
最佳答案
Fallthrough
落入下一个案例,而不是下一个匹配案例。这个概念继承自 C switch
语句,其中每个 case
都可以被认为是一个 goto
目标标签,而 switch
语句将执行带到第一个匹配的。
在 C 语言中,switch
语句仅指示 block 内开始 执行的位置。为了更加方便,您可以使用break
语句跳过switch
主体的其余部分,但没有任何强制要求;如果不这样做,执行将继续正常进行,就像 case
不存在一样。例如:
switch (countdown)
{
case 3: puts("3...");
case 2: puts("2...");
case 1: puts("1...");
case 0: puts("0!");
}
任何地方都没有 break
,如果 countdown
是 3,那么你就得到了全部(即使 countdown
显然是 3,而不是2、1 或 0)。
当执行从一个案例转到另一个案例而不是退出 switch
范围时(例如,使用 break
语句),你会“失败”(这是Swift fallthrough
关键字的作用)。
这在 C 中是相关的,因为您可以在 switch
语句中使用任意复杂的结构,如果需要,可以重叠大小写。这是一个合法的 C 程序:
switch (x)
{
case 0:
if (y == 3)
{
case 1:
puts("hello");
}
else
{
puts("world");
}
case 2:
puts("!");
}
然而,这种用法极为不常见且通常难以遵循(快点!如果 x == 1
是否可以执行 else 分支?)。我没有测试过,但如果您能用 Swift 做类似的事情,我会感到非常惊讶。
一般来说,在 C 中,失败被认为是糟糕的风格,因为通常很难判断失败是自愿的还是由于缺少 break
语句。 Swift 使用 fallthrough
语句解决了这个问题,它明确表示您希望执行继续到 switch
语句中的下一个 case,而不是退出 switch
范围。
在你的情况下,你不能使用 fallthrough 来获得你想要的东西,因为 fallthrough 只有在你需要的执行顺序是线性的时候才有用。您需要跳过无效代码块,因此需要使用 if-else
序列而不是 switch
语句。
关于Swift:Switch 语句失败行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32343690/