Как перечислить краткий словарь (или преобразовать все ключи типа словаря) в Swift? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть словарь с типом [MyKeys : Any]. Где MyKeys - это Enum с String в качестве rawValue. Мне нужно преобразовать этот тип ключа в String. Или, скорее, создайте новый словарь из этого текущего словаря с типом [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])

UPDATE:

Я нашел лучший способ, пока ждал ответов:

var finalDic = [String : Any]()
keyDic.enumerated().map{( finalDic[$0.element.key.rawValue] = $0.element.value )}
finally(finalDic)

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы можете сделать вашу функцию более универсальной (она будет работать с любым Dictionary, чей ключ 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
        })
    }
}

Тогда назовите это так:

[MyKey.aaa : 123].enumKeyToStringKey()
0 голосов
/ 29 октября 2018

Ваш цикл может быть упрощен до

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]

Исходный словарь сопоставляется с последовательностью преобразованного ключа / значения пары, из которых создается новый словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...