如何在Swift中给定路径片段的嵌套字典中更新值? [英] How to update a value in a nested dictionary given path fragment in Swift?
问题描述
我有一个嵌套的字典和一个包含路径片段的数组.我需要在该位置更新值.
I have a nested dictionary and an array containing path fragment. I need to update the value at that location.
我可能正在寻找一个递归函数,而不是对Dictionary
类型等的扩展.
I am possibly looking for a recursive function instead of extensions to Dictionary
types and such.
我无法递归执行此操作,因为我复制了inout
参数.
I am not able to do this recursively because I making a copy of the inout
param.
var dict: [String: Any] = ["channel": ["item": ["title": 1111]]]
var pathFrag = ["channel", "item", "title"]
var val = 123
func addAt(pathFrag: inout [String], val: Int, data: inout [String: Any]) {
if let first = pathFrag.first {
if let item = data[first] {
print(item)
pathFrag.remove(at: 0)
if !pathFrag.isEmpty {
var d: [String: Any] = data[first] as! [String: Any]
print("e: \(d)")
return addAt(pathFrag: &pathFrag, string: string, data: &d)
} else {
data[first] = val
print("else: \(data)") // ["title": 123]
}
}
}
}
addAt(pathFrag: &pathFrag, val: val, data: &dict)
print(dict)
如何将title
的值更新为123
?
推荐答案
请注意,var d: [String: Any] = data[first] as! [String: Any]
复制data[first]
,而不是像&
和inout
那样对其进行引用.因此,当调用addAt(pathFrag: &pathFrag, string: string, data: &d)
时,仅d
被更改.为了使此更改反映在原始的data[first]
上,您必须将d
分配回data[first]
.
Note that var d: [String: Any] = data[first] as! [String: Any]
makes a copy of data[first]
and not a reference to it like &
and inout
. So, when addAt(pathFrag: &pathFrag, string: string, data: &d)
is called, only d
is changed. To make this change reflect on the original data[first]
, you have to assign d
back to data[first]
.
执行此操作:
var dict: [String: Any] = ["channel": ["item": ["title": 1111]]]
var pathFrag = ["channel", "item", "title"]
func addAt(pathFrag: inout [String], data: inout [String: Any]) {
if let first = pathFrag.first {
if let item = data[first] {
pathFrag.remove(at: 0)
if !pathFrag.isEmpty {
var d: [String: Any] = data[first] as! [String: Any]
addAt(pathFrag: &pathFrag, data: &d)
data[first] = d
} else {
data[first] = 123
}
}
}
}
addAt(pathFrag: &pathFrag, data: &dict)
print(dict)
这篇关于如何在Swift中给定路径片段的嵌套字典中更新值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!