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实现遍历嵌套字典并修改其中的值的主要内容,如果未能解决你的问题,请参考以下文章