Swift:切换声明的通过行为

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语句工作?

zne*_*eak 7

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语句.