swift实现遍历嵌套字典并修改其中的值

Posted JackLee18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift实现遍历嵌套字典并修改其中的值相关的知识,希望对你有一定的参考价值。

  在swift中数组与字典都是值类型,在OC中数组与字典都是引用类型。在swift中数组或者字典增加一个新的元素,那么就会产生一个新的副本,但是在OC中可变数组或者可变字典并没有产生这样的变化。

  如果要改变一个字典中的某个键值对应的数组中的元素数量(备注:这个键值的层级不确定),在OC中的话如果键值对应的数组是可变数组,那么我们只用通过递归遍历的形式获取这个可变数组的指针地址,然后增加或者删除元素即可。如果键值对应的数组是不可变数组,那么我们首先需要进行如下的操作

NSArray *array = dic[@"key"];
NSMutableArray *array1 = [array mutableCopy];
[array1 removeFirstObject];
dic[@"key"] = array1;

在swift中由于字典和数组都是值类型,因此操作和OC中键值对应的元素是非可变数组有些类似,具体如下:

var array =  dic["key"]
array.append(1)
dic["key"] = array

如果键值的层级不确定呢,我们可以使用递归的形式在递归结束的下一行执行赋值操作,具体代码如下:

extension Dictionary 
   
    mutating func updateValueRecursively(forKey key : Key, newValue: Value) -> Bool
    
        if keys.contains(key)
        
            self[key] = newValue
            return true
        
        
        for (valueKey,value) in self 
//            print("value:\\(value)")
            if value is Dictionary 
                var dic = (value as! Dictionary)
                let result = dic.updateValueRecursively(forKey: key, newValue: newValue)
                if result == true 
                    self[valueKey] = dic as! Value
                    return true
                
             else if value is [Any] 
//                print("array: \\(value)")
                var array = (value as! [Any])
                let result = array .updateValueRecursively(forKey: key as! String, newValue: newValue)
                if result == true 
                    self[valueKey] = array as! Value
                    return true
                
            
        
        return false
        
    
    


extension Array 
    
    mutating func updateValueRecursively(forKey key : String, newValue: Any) -> Bool
    
        for index in 0 ..< self.count 
            var element = self[index]
            if element is [String:Any] 
                var dic = element as! [String:Any]
                let result = dic.updateValueRecursively(forKey: key, newValue: newValue)
                if result == true 
                    self[index] = dic as! Element
                    return true
                
                
             else if element is [Any] 
                var array = element as! [Any]
                let result = array.updateValueRecursively(forKey: key, newValue: newValue)
                if result == true 
                    self[index] = array as! Element
                    return true
                
            
        
        return false
    
        

参考网址:https://stackoverflow.com/questions/55019777/change-json-value-for-a-key-which-can-be-nested-in-swift

以上是关于swift实现遍历嵌套字典并修改其中的值的主要内容,如果未能解决你的问题,请参考以下文章

swift实现遍历嵌套字典并修改其中的值

递归遍历带有列表的嵌套字典,并替换匹配的值

Python编程入门到实践 - 笔记( 6 章)

python3循环遍历嵌套字典替换指定值

使用列表中的项目更改嵌套字典的字典中的值?

Python字典集合结构详解