swift - 如何在 Swift 中更新给定路径片段的嵌套字典中的值?

标签 swift dictionary inout

我有一个嵌套字典和一个包含路径片段的数组。我需要更新该位置的值。

我可能正在寻找递归函数,而不是对 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/

相关文章:

java - Spring的存储过程,解析结果Map

ios - 无法将 'NSObject' 类型的不可变值作为 inout 参数传递

ios - 将引用存储在变量 SWIFT 4 中

ios - 当应用程序转到后台时,URLSessions 给出 URLResponse nil

swift - 哪些 unicode 代码可以安全地用作保留值?

swift - swift 从 http sendAsyncRequest 调用中返回数据

python - 从嵌套列表生成字典,Python 3.6

ios - 如何从不同层次的JSON对象中拉取数据

python - 将一个句子分成两部分并将它们作为 Python 中的键和值存储到 defaultdict 中

swift - Inout 不使用 SubClass 对象抛出无法将不可变值作为 inout 参数传递