为什么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
,案例也会执行失败。
关于 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
,案例也会执行失败。