2014-09-30 103 views
7

鉴于C#中的以下枚举以及根据其状态返回文本框边框颜色的开关/案例。将默认案例与其他案例结合使用

enum TextboxState { 
Default, 
Error 
} 

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

所以基本上我定义了一个真实的,而不只是按约定的默认状态又名TextboxState.Default通过添加default:情况。我只是想要做到这一点,以防止将新的值添加到枚举中以后的更改。

据雨燕的书,这是不可能的:

“如果没有适当的,为每一个可能的 值开关的情况下,您可以定义默认包罗万象的情况下,以支付任何值 没有明确解决。这个包罗万象的情况下被 表示关键字默认值,必须总是在最后出现。”

该段是关于很清楚,所以我想我上面的模式并不适用于斯威夫特还是我想念什么?是否有另一种方法来存档类似上面的代码?

回答

11

您可以使用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个案。

+1

作为参考,下面的切换部分记录在此处:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html – 2014-09-30 16:27:37

1

从您的switch中删除default:行。即使你有一天在你的枚举中增加了额外的例子,如果你没有将相应的例子添加到使用该枚举的每个switch,Swift编译器都会投诉。而FYI,您不需要在switch中的case值之前指定TextboxState.,因为编译器知道fooTextboxState。生成的代码是:

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

虽然,为了保持一致性,我把.Error情况下前.Default之一。