为什么Xcode告诉我最后一个案例永远不会执行?
关于StackOverflow的另一个问题,我在Swift中输入了一些测试代码,令我惊讶的是,它告诉我最后一个案例永远不会执行(带有为什么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
.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的建议重构交换机