のは、私は別の値に列挙型を変換したいとしましょう:この例ではスイッチマップ:どのようにスイッチすることなく、値を列挙型をマップする
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"
}
私はString
にMyEnum
を変換しています(ただし、他のタイプかもしれません) 。
今、私はその醜い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
返しますが、私は、私はそれよりも優れて行うことができるとは思わないので、私は知っている、このソリューションはまた、完璧ではありません。
と文字列値にアクセス、 'String'だけではありません。 – rmaddy
@rmaddyフェアポイント。私の答えは、列挙型のすべてのケースが同じ型を持ち、生の値を使用できる場合にのみ機能します。あなたも関連する価値のために働きます。 – Sparky
正確に@rmaddyが言った –