2017-09-21 5 views
0

のは、私は別の値に列挙型を変換したいとしましょう:この例ではスイッチマップ:どのようにスイッチすることなく、値を列挙型をマップする

enum MyEnum { 

    case a 
    case b 
    case c 

} 

let myEnum: MyEnum = .a 

let string: String 
switch myEnum { 
case .a: 
    string = "a-string" 
case .b: 
    string = "b-string" 
case .c 
    string = "c-string" 
} 

私はStringMyEnumを変換しています(ただし、他のタイプかもしれません) 。

今、私はその醜いswitchを持って、caseごとに割り当て操作string =を繰り返す必要がありました。

私が本当に欲しいのはこのようなものです:

let string = switchMap(myEnum, [ 
    (.a, "a-string"), 
    (.b, "b-string"), 
    (.c, "c-string") 
]) 

彼らは、私はそれがこのようなものだったの実装を考えた:

func switchMap<V, R>(_ value: V, _ patterns: [(V, R)]) -> R? { 
    for (k, v) in patterns { 
     switch value { 
     case k: 
      return v 
     default:() 
     } 
    } 

    return nil 
} 

しかし、これは私にエラーExpression pattern of type 'V' cannot match values of type 'V'を与えます。

これを解決する方法はありますか?多分もっと良い方法で? (理想的には、私はHaskellのパターンマッチングに似た、os構文のようなものを探しています)。

swiftステートメントに代わるものも探していますので、switchが受け入れるパターンを入力するようにしたいと思います。

OBS:switchが、それは徹底的なことを知っているようにコンパイラに依存していることから、それはR?代わりのR返しますが、私は、私はそれよりも優れて行うことができるとは思わないので、私は知っている、このソリューションはまた、完璧ではありません。

答えて

1

あなただけの例にrawValuesを割り当てることができます。

enum MyEnum : String { 

    case a = "a" 
    case b = "b" 
    case c = "c" 

} 

それからちょうどa.rawValue質問等は要件が異なる種類の列挙型をマップするために得ることをほのめかす

+0

と文字列値にアクセス、 'String'だけではありません。 – rmaddy

+0

@rmaddyフェア​​ポイント。私の答えは、列挙型のすべてのケースが同じ型を持ち、生の値を使用できる場合にのみ機能します。あなたも関連する価値のために働きます。 – Sparky

+0

正確に@rmaddyが言った –

関連する問題