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

Why does Xcode tell me that the last case will never be executed?

关于 Whosebug 上的另一个问题,我在 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()
    }
}

因为你没有从case .A, .E落空,而且最后一个案例和第二个案例一样,所以会匹配到第二个。

fallthrough 关键字表示“不执行任何额外检查就转到下一个案例。当遇到 .A 时,您的代码将执行这四个方法:

    someMethodSpecificToA()
    someMethodSpecificToTheseThreeLetters()
    someMethodSpecificToE()
    aMethodIShouldCallOnVowels()

因为它将进入 case .A,并保持 "falling through" 一直到 aMethodIShouldCallOnVowels()

由于 .A.E 上没有 fallthrough,一旦 .B .C .D 案例的第一个实例出现在 switch 上,它将一直走到 .A .E。此时没有进行额外的切换,并且 .B .C .D 已经通过初始跳跃进行了探索。

这就是您的方法行不通的原因:您需要将 switch 分成两个单独的,或者为 .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,案例也会执行失败。