Swift 4.1:字典中的数组未更新问题求助
解决Swift字典中数组无法同步更新的问题
这问题我之前也碰到过,核心原因是Swift里数组的值类型特性在搞鬼!
问题根源
在Swift中,Array是值类型,当你执行dictionary["array"] = array这行代码时,并不是把数组的引用存进字典,而是创建了一份数组的拷贝并存储。所以后续你对原array做的append操作,只会修改原来的数组实例,字典里的那份拷贝完全不会同步变化。
解决方案
根据你的使用场景,这里有几种可行的解决方式:
1. 先填充数组,再赋值给字典(最简单直接)
如果不需要先把空数组放进字典,这种方式最省心:
var dictionary = [String: Any]() var array = [[String: Any]]() var dict1:[String:Any] = ["abc": 123, "def": true] var dict2:[String:Any] = ["111": 1.2345, "222": "hello"] // 先把元素添加到数组 array.append(dict1) array.append(dict2) // 再将填充好的数组赋值给字典 dictionary["array"] = array
2. 从字典中取出数组修改后重新存入
如果必须先将空数组放入字典,后续再动态修改,可以先取出数组、修改后再存回去:
var dictionary = [String: Any]() var array = [[String: Any]]() dictionary["array"] = array var dict1:[String:Any] = ["abc": 123, "def": true] var dict2:[String:Any] = ["111": 1.2345, "222": "hello"] // 从字典中取出数组(需要类型转换),修改后重新赋值 if var existingArray = dictionary["array"] as? [[String: Any]] { existingArray.append(dict1) existingArray.append(dict2) dictionary["array"] = existingArray }
3. 使用引用类型包装数组(适合需要频繁动态修改的场景)
如果需要后续多次修改字典中的数组,不想每次都取出存入,可以把数组包装在一个类(引用类型)里:
// 定义一个通用的数组包装类 class ArrayWrapper<T> { var array: [T] = [] } var dictionary = [String: Any]() let arrayWrapper = ArrayWrapper<[String: Any]>() dictionary["array"] = arrayWrapper var dict1:[String:Any] = ["abc": 123, "def": true] var dict2:[String:Any] = ["111": 1.2345, "222": "hello"] // 修改包装类中的数组,字典里的引用会同步更新 arrayWrapper.array.append(dict1) arrayWrapper.array.append(dict2)
内容的提问来源于stack exchange,提问作者jgtww
相关产品推荐
相关产品推荐

