如何复制类型为[Int: [LearningItem]]的字典变量?
Swift 字典复制的正确方法
错误原因
你用的Dictionary(items)初始化器是用于从**键值对序列(如[(Key, Value)]数组)**创建字典的,不能直接传入已有字典实例,因此会触发类型错误。
正确复制方式
根据你的需求分为两种场景:
1. 浅拷贝(默认场景)
Swift 的字典是值类型,直接赋值就会自动完成浅拷贝:
var items = [Int:[LearningItem]]() // 先给items填充数据 var copiedItems = items
- 若
LearningItem是值类型(struct):拷贝后两个字典完全独立,修改任意一方的内容不会影响另一方。 - 若
LearningItem是引用类型(class):拷贝后的字典会生成新的数组容器,但数组内的LearningItem实例还是同一个引用,修改实例属性会影响两边。
2. 深拷贝(需完全独立引用类型实例时)
如果LearningItem是类,且需要完全复制所有实例(让拷贝后的字典和原字典彻底独立),需要手动实现实例的复制逻辑:
首先给LearningItem添加复制能力,比如遵循NSCopying协议:
class LearningItem: NSCopying { var content: String init(content: String) { self.content = content } // 实现NSCopying的复制方法 func copy(with zone: NSZone? = nil) -> Any { return LearningItem(content: self.content) } }
然后遍历字典完成深拷贝:
var deepCopiedItems = items.mapValues { learningItems in learningItems.map { $0.copy() as! LearningItem } }
如果不想用NSCopying,也可以自定义复制初始化器,替换map里的逻辑即可。
内容的提问来源于stack exchange,提问作者Chris Hansen
相关产品推荐
相关产品推荐

