如何在Swift中枚举简写的字典(或转换字典的所有键类型)?

时间:2018-10-29 12:11:52

标签: swift dictionary

我有一本类型为[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])

2 个答案:

答案 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
        })
    }
}