【问题标题】:Switch in Swift - Case label in a switch should have at least one executable statementSwitch in Swift - switch 中的 case 标签应该至少有一个可执行语句
【发布时间】:2015-01-23 17:32:29
【问题描述】:

我有一个 enum 类型,它在 Swift 中扩展了 String

当我尝试使用 switch 时出现错误:

switch 中的 case 标签应该至少有一个可执行语句

这是我的代码:

enum UserInfosKey:String {
   case CameraMyPhotoStream = "CMPS"
    case CameraICloudActivated = "CICA"
    case CameraICloudShare = "CICS"
    case ProjectTodayExtension = "PTE"
    case ProjectShareExtension = "PSE"
    case NetworkConnection = "NC"
    case PhoneLanguage = "PL"
    case CameraPhotosCount = "CPC"
    case UserIdentifier = "UI"
    case VersionHistory = "VH"
    case Path = "Path"

}

class UserInfosController: NSObject {
    func update(key:UserInfosKey, value:String, context:UserDefaultsMainKeys) -> String {
        switch key {
        case .CameraICloudActivated:
        case .CameraICloudShare:
        case .CameraMyPhotoStream:
        case .CameraPhotosCount:
        case .NetworkConnection:
        case .PhoneLanguage:
        case .UserIdentifier:
            return value

        default:
            return ""
        }
    }
}

我很确定这是一个简单的错误,有人看到了吗?

【问题讨论】:

    标签: ios iphone swift enums switch-statement


    【解决方案1】:

    swift switch 语句中没有隐含的失败,因此您必须明确设置:

        case .CameraICloudActivated: fallthrough
        case .CameraICloudShare: fallthrough
        case .CameraMyPhotoStream: fallthrough
        case .CameraPhotosCount: fallthrough
        case .NetworkConnection: fallthrough
        case .PhoneLanguage: fallthrough
        case .UserIdentifier:
            return value
    

    没有它,每个案例都有隐含的中断。

    请注意,swift 要求每个 switch case 至少包含一个语句 - 如果没有语句,则必须使用显式 break(在这种情况下表示“什么都不做”)

    【讨论】:

    • 好的,我发现你可以用逗号来快捷方式。 case .value1, .value2:。我忘记了,但这是在电子书的第一章。 (我会尽快接受这个答案)
    • 是的,这是另一种方式,但对于一个长列表,我更喜欢一个明确的逐个列表,尽管以牺牲更多代码为代价——这在我看来更具可读性,但这只是一个问题偏爱。很高兴有不止一种方法来做同样的事情。
    • @Francescu 那你为什么不选择 Cenny 的答案呢?那应该是正确的答案。这个不应该
    • @JandroRojas 我不太喜欢你的语气。答案是 5 年以上,在另一个答案写出来之前就被接受了,而且在技术上仍然是正确的。
    • @Francescu 我不知道你指的是什么语气,但这个答案不应该被认为是正确的(甚至在技术上也不应该)......是的,它有效,但它基本上与复制和粘贴相同每个案例块的内容。当正确答案的投票数少于“技术上正确”的答案时,这总是一种耻辱......
    【解决方案2】:

    一个case可以有多个值,只需用逗号分隔即可。

    我还建议返回一个 nil 值而不是一个空字符串,并将函数返回值设为 String?,但这取决于函数的使用方式。

    func update(key:UserInfosKey, value:String, context:UserDefaultsMainKeys) -> String? {
        switch key {
        case .CameraICloudActivated, 
             .CameraICloudShare, 
             .CameraMyPhotoStream,
             .CameraPhotosCount, 
             .NetworkConnection, 
             .PhoneLanguage, 
             .UserIdentifier:
            return value  
        default:
            return nil
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-11
      • 2014-03-27
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多