Swift 开关映射:如何在没有开关的情况下将枚举映射到值

Swift 开关映射:如何在没有开关的情况下将枚举映射到值,swift,enums,switch-statement,Swift,Enums,Switch Statement,假设我要将枚举转换为另一个值: 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" } 在本例中,我将MyEnum转换为Strin

假设我要将枚举转换为另一个值:

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"
}
在本例中,我将
MyEnum
转换为
String
(但可以是其他类型)

现在,它迫使我使用丑陋的
开关
,并对每个
案例
重复赋值操作
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
}
他们说我想实施的是这样的:

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
}
func开关映射(u值:V,u模式:[(V,R)])->R?{
模式中的(k,v){
开关量{
案例k:
返回v
默认值:()
}
}
归零
}
但是这给了我一个错误,
类型“V”的表达式模式不能匹配类型“V”的值。

你知道怎么解决这个问题吗?也许用更好的方式?(从操作系统语法的角度来看,理想情况下,我正在寻找类似于Haskell的模式匹配的东西)

我也在寻找替代
swift
语句的东西,所以我希望我的输入能够接受
开关所能接受的任何模式


注意:我知道,这个解决方案也不是完美的,因为它返回的是
R?
,而不是
R
,但我认为我不能做得比这更好,因为
switch
依赖于编译器来知道它是穷举的。

您可以将原始值分配给案例:

enum MyEnum : String {

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

}

然后只需使用.rawValue等访问字符串值。

您只需将rawValue分配给案例:

enum MyEnum : String {

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

}

然后使用.rawValue等访问字符串值。

问题提示可能需要将枚举映射到不同类型,而不仅仅是
string
@rmaddy fair point。我的答案只有在枚举中的所有案例都具有相同类型,因此可以使用原始值时才有效。你的也适用于相关值。正如@rmaddy所说的,我感谢他的输入,因此我在评论中使用了他的标签!这个问题暗示,可能需要将枚举映射到不同的类型,而不仅仅是
String
@rmaddy fair point。我的答案只有在枚举中的所有案例都具有相同类型,因此可以使用原始值时才有效。你的也适用于相关值。正如@rmaddy所说的,我感谢他的输入,因此我在评论中使用了他的标签!