【问题标题】:Combine default case with other cases将默认情况与其他情况结合起来
【发布时间】:2014-09-30 16:06:46
【问题描述】:

例如,给定 C# 中的以下枚举和一个 switch/case,以根据其状态返回文本框的边框颜色。

enum TextboxState {
 Default,
 Error
}

switch(foo) {
 default:
 case TextboxState.Default:  return Color.Black;
 case TextboxState.Error:    return Color.Red;
}

所以基本上我通过添加default: 案例来定义一个真实的而不只是按照惯例默认状态又名TextboxState.Default。如果将新值添加到枚举中,我只想这样做以防止将来发生重大更改。

根据 Swift 书,这是不可能的:

“如果不适合为所有可能的情况提供 switch case 值,您可以定义一个默认的包罗万象的情况以涵盖任何值 没有明确解决的问题。这种包罗万象的情况由 关键字默认值,并且必须始终显示在最后。”

这一段很清楚,所以我假设我上面的模式不适用于 Swift 或者我错过了什么?是否有另一种方法可以归档类似上述代码的内容?

【问题讨论】:

    标签: swift enums


    【解决方案1】:

    您可以使用fallthrough 来做到这一点,方法是在default 情况下移动共享行为,并在您希望共享行为发生的所有情况下使用fallthrough

    例如,如果这是您的枚举(添加了第三种情况以表明它可以处理多次失败):

    enum TextboxState {
        case Default
        case Error
        case SomethingElse
    }
    

    您可以将switch 语句格式化如下:

    switch(foo) {
    case TextboxState.Error:
        return UIColor.redColor()
    
    case TextboxState.Default:
        fallthrough
    
    case TextboxState.SomethingElse:
        fallthrough
    
    default: 
        return UIColor.blackColor()
    }
    

    每个fallthrough 将执行点移动到下一个案例,直到default 案例。

    【讨论】:

    【解决方案2】:

    从您的switch 中删除default: 行。即使有一天你在你的枚举中添加了额外的 case,如果你没有为每个使用枚举的 switch 添加相应的 case,Swift 编译器也会抱怨。仅供参考,您不需要在switch 中的case 值之前指定TextboxState.,因为编译器知道fooTextboxState。结果代码将是:

    switch(foo) {
        case .Default:  return Color.Black;
        case .Error:    return Color.Red;
    }
    

    不过,为了保持一致,我将.Error 放在.Default 之前。

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 2012-02-29
      • 2010-12-02
      • 2012-11-24
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多