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

标签 xcode swift switch-statement

关于 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()
    }
}

最佳答案

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

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

因为它会在 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()
}

关于xcode - 为什么 Xcode 告诉我最后一个 case 永远不会被执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580757/

相关文章:

bash - 任何地方都有 'if' 开关列表吗?

ios - 我怎样才能确保 json 元素不为零?

ios - 为什么在使用代码将 db 复制到文档文件夹之前,Xcode 会自动复制 db 而它是空的?

ios - 如何强制 CocoaPods 使用 Github 仓库的最新版本?

ios - 如何获取 nil 的默认值

networking - 路由器与交换机(网络地址转换)

java - 需要关于重构大型 java switch-case 的建议

iphone - 使单元格填充 UITableView 部分的宽度

ios - 带有可触摸标签的 UITableViewCell

swift - 使用扩展来遵守 Swift 中的协议(protocol)