2014-09-30 37 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之一。