iOSDev решение хорошая и самоочевидная рекурсивная функция. Я бы добавил сюда еще один способ обработки словарей при использовании метода Swift merging (_: uniquingKeysWith:)
Создает словарь путем объединения пар ключ-значение в последовательности в словарь , используя комбинированное замыкание для определения значения для дубликатов ключей.
Доступно в Swift начиная с версии 4.2
Ваше решение может выглядеть изначально
func mergeStandard(_ one: [String: [String: [String: String]]],
_ two: [String: [String: [String: String]]]) -> [String: [String: [String: String]]] {
return one.merging(two) {
$0.merging($1) {
$0.merging($1) { value1, value2 -> String in
return value1 // which is logically wrong, as we should have both values, see the Further Steps section
}
}
}
}
let a = ["Abc": ["Def": ["Jkl": "xxx"]]]
let b = ["Abc": ["Ghi": ["Mno": "yyy"]]]
let c = ["Abc": ["Ghi": ["Pqr": "zzz"]]]
let d = mergeStandard(a, b)
let e = mergeStandard(d, c)
print(e)
//["Abc": ["Def": ["Jkl": "xxx"], "Ghi": ["Mno": "yyy", "Pqr": "zzz"]]]
NB! при попытке ввода другого типа, например
let a = ["Abc": ["Def": ["Jkl": "xxx"]]]
let b = ["Abc": ["Ghi": ["Mno": "yyy", "Pqr": "qqq"]]]
let c = ["Abc": ["Ghi": ["Pqr": "zzz"]]]
Поскольку у вас есть две клавиши "Pqr"
. Приведенный выше код выберет значение "qqq"
для клавиши "Pqr"
. Другой ответ - от iOSDev есть такая же проблема. Пожалуйста, посмотрите решение для этого случая ниже.
Дальнейшие действия
Я бы порекомендовал вам изменить структуру данных на [String: [String: [String: [String]]]]
, чтобы вы имели последнее значение как Sequence
из String
. И тогда вы можете использовать следующее:
func mergeUpgraded(_ one: [String: [String: [String: [String]]]],
_ two: [String: [String: [String: [String]]]]) -> [String: [String: [String: [String]]]] {
return one.merging(two) {
$0.merging($1) {
$0.merging($1) { (arr1, arr2) -> [String] in
var a = arr1
var b = arr2
a.append(contentsOf: b)
return a
}
}
}
}
let a = ["Abc": ["Def": ["Jkl": ["xxx"]]]]
let b = ["Abc": ["Ghi": ["Mno": "yyy", "Pqr": "qqq"]]]
let c = ["Abc": ["Ghi": ["Pqr": "zzz"]]]
let d = mergeUpgraded(a, b)
let e = mergeUpgraded(d, c)
print(e)
// ["Abc": ["Ghi": ["Mno": ["yyy"], "Pqr": ["qqq", "zzz"]], "Def": ["Jkl": ["xxx"]]]]