2016-12-01 15 views
0

我試圖在具有元組的switch語句中使用模式匹配來清楚地表示枚舉不等於一個特定情況的所有情況。這裏是我的switch語句的簡化版本:如何使用具有元組模式匹配的Swift開關語句表示「不等於」

switch (source, type, status) { 
     case (.cashVoucher, _, .awaitingValidation): 
      return cashVoucherAwaitingValidationMessageComponants 
     case (.cashVoucher, _, != .awaitingValidation): 
      return validatedCashVoucherMessageComponants 
     default: 
      fatalError("") 
     } 

這不明明編譯監守的不正確使用=運算符的,但它給你的我想要實現的想法。

我想要第一個案例匹配來源.cashVoucher和狀態.awaitingValidation

我希望第二種情況匹配來源.cashVoucher以及除.awaitingValidation以外的任何狀態。

到目前爲止,我可以想到的有兩種解決方案,但它們並不像我想的那樣可讀。我可以簡單地列出所有其他狀態情況,但共有8個情況,並且很難閱讀。 Alernativly,我可以只使用案例case (.cashVoucher, _, _):,並由於切換案件的順序,它會做我想要實現的,但我的切換語句實際上總共有16個案例,依靠切換案例的順序使它更難讓讀者瞭解我的意見。

那麼有沒有什麼方法可以用類似於我上面提到的!= .awaitingValidation來表達這個?

回答

4

你應該能夠把它寫爲:

switch (source, type, status) { 
case (.cashVoucher, _, let st) where st == .awaitingValidation: 
    return cashVoucherAwaitingValidationMessageComponants 
case (.cashVoucher, _, let st) where st != .awaitingValidation: 
    return validatedCashVoucherMessageComponants 
default: 
    fatalError("") 
} 

因此,元組的第三個值賦給一個常數(這裏st),並使用where來檢查是否相等。

+3

請注意,在第一個'case'中不需要綁定'st',您仍然可以說'case(.cashVoucher,_,.awaitingValidation)'。 – Hamish

+2

......第二種情況可以是'case(.cashVoucher,_,_)'...... –

+2

Martin R,我說明了我不使用這種方法的原因 –

相關問題