Swift: Switch statement fallthrough behavior
目前我有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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语句的目标是,如果是真的,就打印每个case,而不是只打印匹配的第一个case。我想我可以用Fallthrough语句来实现这一点。然而,这让我怀疑它是如何工作的。为什么Fallthrough会自动打印行中的下一个案例,即使案例不匹配?我怎样才能让这个switch语句按我想要的方式工作呢?
在C语言中,
1 2 3 4 5 6 7 | switch (countdown) { case 3: puts("3..."); case 2: puts("2..."); case 1: puts("1..."); case 0: puts("0!"); } |
在没有
当执行从一个案例转到另一个案例,而不是退出
这在C中是相关的,因为您可以在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | switch (x) { case 0: if (y == 3) { case 1: puts("hello"); } else { puts("world"); } case 2: puts("!"); } |
然而,这种使用非常罕见,而且往往难以遵循(快速!如果是
一般来说,在C语言中,失败被认为是糟糕的风格,因为通常很难判断失败是自愿的还是由于缺少
在您的情况下,不能使用Fallthrough获得您想要的,因为Fallthrough只在您需要的执行序列是线性的时候才有用。您需要跳过无效的代码块,因此需要使用
如果你想找到其他匹配的案例而不是下一个(如
相反,您应该使用一系列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Bool gotOne = false; if (somePoint.0 == 0 && somepoint.1 == 0) { print("origin") gotOne = true; } if (somepoint.1 == 0) { print("y-axis") gotOne = true; } if (somepoint.0 == 0) { print("x-axis") gotOne = true; } : if (! gotOne) { print("somewhere else") } |