我有一本类型为[MyKeys : Any]
的字典。其中MyKeys
是一个Enum
作为其String
的{{1}}。我需要将该密钥类型转换为rawValue
。或者更确切地说,使用该类型的String
从当前词典中创建一个新词典。
到目前为止,我已经在Playground上玩过这段代码。它可以工作,但是我需要一个更高效的(如果有的话)和一个较短的。
[String : Any]
更新:
在等待一些答案时,我找到了一种更好的方法:
import UIKit
enum MyKey: String {
case aaa = "lalal"
}
func lolo(_ keyDic: [MyKey : Any]) {
var finalDic = [String : Any]()
for keyDic in keyDic.enumerated() {
let key = keyDic.element.key
let val = keyDic.element.value
finalDic[key.rawValue] = val
}
finally(finalDic)
}
func finally(_ dic: [String : Any]) {
print(dic)
}
lolo([MyKey.aaa : 123])
答案 0 :(得分:3)
您的循环可以简化为
for (key, value) in keyDic {
finalDic[key.rawValue] = value
}
不一定是效率更高,但更短,更简单的方法是:
let dict = [MyKey.aaa : 123]
let newDict = Dictionary(uniqueKeysWithValues: dict.map { ($0.key.rawValue, $0.value )})
print(newDict) // "lalal": 123]
原始字典映射到转换后的键/值序列 对,从中实例化新字典。
答案 1 :(得分:2)
您可以使函数更通用(可以在键为具有原始值Dictionary
的{{1}}的任何enum
上使用),并且使用下面的方法使函数更短(虽然不一定更有效)功能:
String
然后这样称呼它:
extension Dictionary where Key: RawRepresentable, Key.RawValue: Hashable {
func enumKeyToStringKey() -> [Key.RawValue: Value] {
return self.reduce(into: [Key.RawValue:Value](), { currentResult, keyValue in
currentResult[keyValue.key.rawValue] = keyValue.value
})
}
}