我有一个嵌套字典和一个包含路径片段的数组。我需要更新该位置的值。
我可能正在寻找递归函数,而不是对 Dictionary
类型等的扩展。
我无法递归地执行此操作,因为我复制了 inout
参数。
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
?
最佳答案
这不是你问的,但这里的整个前提是unSwifty。使用 [String:Any]
是一种不好的气味。它看起来更像 Objective-C。事实上,这整件事在 Objective-C 中只是一句台词:
NSMutableDictionary * d1 = [[NSMutableDictionary alloc] initWithDictionary: @{ @"title" : @1111 }];
NSMutableDictionary * d2 = [[NSMutableDictionary alloc] initWithDictionary: @{ @"item" : d1 }];
NSMutableDictionary * d3 = [[NSMutableDictionary alloc] initWithDictionary: @{ @"channel" : d2 }];
好吧,这只是准备数据。这是一句话:
[d3 setValue:@123 forKeyPath:@"channel.item.title"];
但我会质疑整个嵌套字典的概念;在我看来,你在这里走错了路,你需要退后一步,重新思考你的数据结构。
关于swift - 如何在 Swift 中更新给定路径片段的嵌套字典中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55198324/