为什么Xcode告诉我最后一个案例永远不会执行?

为什么Xcode告诉我最后一个案例永远不会执行?,xcode,swift,switch-statement,Xcode,Swift,Switch Statement,关于StackOverflow的另一个问题,我在Swift中输入了一些测试代码,令我惊讶的是,它告诉我最后一个案例永远不会执行(带有.B、.C、.D),有人有什么想法吗 func test(someEnum: EnumType) { switch someEnum { case .A: someMethodSpecificToA() fallthrough case .B, .C, .D: someMethodSpecifi

关于StackOverflow的另一个问题,我在Swift中输入了一些测试代码,令我惊讶的是,它告诉我最后一个案例永远不会执行(带有
.B、.C、.D
),有人有什么想法吗

func test(someEnum: EnumType) {
    switch someEnum {
    case .A:
        someMethodSpecificToA()
        fallthrough
    case .B, .C, .D:
        someMethodSpecificToTheseThreeLetters()
        fallthrough
    case .E:
        someMethodSpecificToE()
        fallthrough
    case .A, .E:
        aMethodIShouldCallOnVowels()
    case .B, .C, .D:
        aMethodIShouldCallOnAllConsonants()
    }
}

因为您不会从
案例.A、.E
中掉入谷底,最后一个案例与第二个案例相同,因此它将与第二个案例匹配。

故障排除
关键字表示“在不执行任何附加检查的情况下转到下一个案例。当遇到
.A
时,您的代码将执行以下四种方法:

    someMethodSpecificToA()
    someMethodSpecificToTheseThreeLetters()
    someMethodSpecificToE()
    aMethodIShouldCallOnVowels()
因为它将进入
case.A
,并一直“跌破”到
aMethodIShouldCallOnVowels()

由于
.A
.E
上没有
故障
,一旦
.B.C.D
案例的第一个实例在
开关上到达
,它将一直运行到
.A.E
。此时没有额外的切换,并且
.B.C.D
已经通过初始跳跃

这就是为什么您的方法行不通:您需要将
开关
拆分为两个单独的开关,或者为
.E
.a
添加一个特例

switch someEnum {
case .A .E:
    switch someEnum {
    case .A:
        someMethodSpecificToA()
    case .E:     
        someMethodSpecificToE()
    }
    aMethodIShouldCallOnVowels()
case .B, .C, .D:
    someMethodSpecificToTheseThreeLetters()
    aMethodIShouldCallOnAllConsonants()
}

更简单地说,你不能重复一个案例。在你的代码片段中,
case.B、.C、.D:
是重复的。如果你也错误地这样做,
case.B、.C、.C
,那么案例也将无法执行。

似乎我完全误解了
fallthrough
:oIs有没有一种方法可以让控制流流向下一个case语句,并拥有它检查它,可能会绑定值?
continue
无法使用。不,我不知道Swift中有这样的构造。我认为您应该按照@dasblinkenlight的建议重构交换机