You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复制类型为[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:12:08