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所说的,我感谢他的输入,因此我在评论中使用了他的标签!