Sam*_* S. 2 switch-statement swift
目前我有这个:
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
}
Run Code Online (Sandbox Code Playgroud)
我的这个switch语句的目标是让每个case打印如果它是真的而不是只有第一个匹配print的case.我以为我可以通过这个演绎声明来做到这一点.但是,这让我怀疑它是如何工作的.即使案例不匹配,为什么fallthrough会自动打印下一个案例?我怎么能按照我想要的方式使这个switch语句工作?
Fallthrough落到下一个案例,而不是下一个匹配案例.该概念继承自C switch语句,其中每个语句都case可以被认为是goto目标标签,并且该switch语句将执行带到第一个匹配的语句.
在C中,该switch语句仅指示块内执行的开始位置.为了方便起见,您可以使用该break语句跳过switch身体的其他部分,但没有任何东西会强迫您; 如果你不这样做,执行会继续正常进行,就像cases不存在一样.例如:
switch (countdown)
{
case 3: puts("3...");
case 2: puts("2...");
case 1: puts("1...");
case 0: puts("0!");
}
Run Code Online (Sandbox Code Playgroud)
没有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("!");
}
Run Code Online (Sandbox Code Playgroud)
然而,这种使用非常罕见并且通常难以遵循(快速!如果可以执行else分支x == 1吗?).我还没有测试过,但如果你能用Swift做类似的话,我会很惊讶.
一般来说,在C中,跌倒被认为是不好的风格,因为通常很难判断跌倒是自愿的还是由于缺少break陈述.Swift使用该fallthrough语句解决了这个问题,这使得您明确希望执行继续执行switch语句中的下一个案例而不是退出switch范围.
在您的情况下,您不能使用fallthrough来获得所需的内容,因为只有在您需要的执行顺序是线性时,才能使用fallthrough.您需要跳过无效的代码块,因此需要使用if-else序列而不是switch语句.
| 归档时间: |
|
| 查看次数: |
3001 次 |
| 最近记录: |