如何在Swift中给定路径片段的嵌套字典中更新值? [英] How to update a value in a nested dictionary given path fragment in Swift?

查看:104
本文介绍了如何在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆