2016-12-01 6 views
0

switch文でタプルを使用してパターンマッチングを使用して、enumが特定の1つのケースに等しくないすべてのケースを明確に表現しようとしています。ここに私のswitch文の短縮バージョンです!タプルパターンマッチングのSwift switch文で「等しくない」表現方法

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

は、これは=演算子の誤った使用のbecuase明らかにコンパイルされませんが、それはあなたに私が達成しようとしているかのアイデアを提供します。

私は最初のケースが.cashVoucherのソースと.awaitingValidationのステータスと一致するようにします。

ソース.cashVoucherと一致する2番目のケースと、.awaitingValidation以外のステータスが必要です。

これまで考えていた2つの解決策がありますが、私が望むほど読みにくいです。私は他のすべてのステータスケースを単純に列挙できますが、合計で8つあり、読みにくくなります。 Alernativly、私はちょうどケースcase (.cashVoucher, _, _):を使用することができ、スイッチのケースの順序のために私が達成しようとしていることを行うだろうが、私のswitch文actaullyは合計で16ケースを持ち、スイッチケースの順序に依存することにより、読者が私の意見で理解できるように。

これは、上記の!= .awaitingValidationと同様のものを使用して表現する方法はありますか?

答えて

4

あなたはとしてそれを書くことができるはずです。だから、定数にタプルの3番目の値を割り当てます(ここではst)との等価性をチェックするためにwhereを使用

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

+3

最初の 'case'で' st'にバインドする必要はないので、 'case(.cashVoucher、_、.awaitingValidation)'と言うことができます。 – Hamish

+2

...そして、2番目のケースは 'case(.cashVoucher、_、_)'となる可能性があります... –

+2

Martin R、このアプローチを使用しない理由を述べました –

関連する問題