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

vrw*_*wim 2 xcode switch-statement 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

fallthrough关键字意味着"在不执行任何额外检查的情况下进入下一个案例..A遇到以下情况时,您的代码将执行以下四种方法:

    someMethodSpecificToA()
    someMethodSpecificToTheseThreeLetters()
    someMethodSpecificToE()
    aMethodIShouldCallOnVowels()
Run Code Online (Sandbox Code Playgroud)

因为它会进入case .A,并一直"堕入" aMethodIShouldCallOnVowels().

由于没有fallthrough.A.E,曾经的第一个实例.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()
}
Run Code Online (Sandbox Code Playgroud)