将默认情况与其他情况相结合

时间:2014-09-30 16:06:47

标签: swift enums

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

enum TextboxState {
 Default,
 Error
}

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

所以基本上我通过添加TextboxState.Default案例来定义一个真实的,而不仅仅是按惯例默认状态default:。我只是想这样做,以防止在枚举中添加新值时将来的更改。

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

  

“如果不适合为每一种可能的情况提供开关盒   值,您可以定义一个默认的catch-all案例来覆盖任何值   未明确解决的问题。这个包罗万象的案例表示   关键字默认值,必须始终显示在最后。“

该段落非常清楚,所以我认为上面的模式不适用于Swift或者我错过了什么?有没有其他方式来存档像上面的代码?

2 个答案:

答案 0 :(得分:11)

您可以使用fallthrough来执行此操作,方法是移动default案例中的共享行为,并在您希望发生共享行为的所有情况下使用fallthrough。< / p>

例如,如果这是你的枚举(添加了第3个案例,表明它可以处理多个掉落):

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案例。

答案 1 :(得分:1)

default:删除switch行。即使有一天你的枚举添加了其他案例,如果你没有向使用枚举的每个switch添加相应的案例,Swift编译器会抱怨。而且,仅供参考,您无需在TextboxState.中的case值之前指定switch,因为编译器知道fooTextboxState。结果代码为:

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

但是,为了保持一致性,我将.Error案例放在.Default之前。