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

SwiftData字典出现AnyHashable重复键致命错误求助

排查与解决思路

1. 确认SwiftData模型的Hashable实现稳定性

SwiftData虽会自动为模型生成Hashable实现,但如果模型包含可变属性,或是你自定义了hash(into:)/==方法,极易引发哈希值不稳定:

  • 若模型有可变属性,绝对不能在模型被加入字典(或SwiftData上下文)后修改这些属性——哈希值一旦变化,字典内部结构会被破坏,直接触发重复键错误。
  • 最稳妥的方式是手动实现Hashable,仅基于模型的唯一标识(比如id字段)计算哈希和判断相等:
extension YourProductionModel: Hashable {
    static func == (lhs: YourProductionModel, rhs: YourProductionModel) -> Bool {
        lhs.id == rhs.id
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
}

2. 检查Picker的绑定逻辑

你怀疑Picker有问题是合理的,这里常见两个坑:

  • 数据源重复:如果Picker的数据源来自SwiftData查询,确保结果无重复实例——可给查询添加.unique()修饰符,或检查入库数据是否本身存在重复。
  • 绑定实例而非标识:直接绑定SwiftData模型实例到Picker的selection,可能在选择过程中出现临时实例引用异常。建议改为绑定模型的id,再通过ID获取实例:
// 将原实例绑定替换为ID绑定
@Binding var selectedItemId: UUID?

// 调整Picker代码
Picker("选择生产项", selection: $selectedItemId) {
    ForEach(yourDataSource) { item in
        Text(item.name).tag(item.id as UUID?)
    }
}

// 保存时通过ID获取对应实例
if let id = selectedItemId,
   let selectedItem = try? context.fetch(FetchDescriptor<YourModel>(predicate: #Predicate { $0.id == id })).first {
    // 后续逻辑使用selectedItem
}

3. 排查保存逻辑中的字典操作

如果代码里手动用字典存储模型实例,检查两点:

  • 是否在插入字典后修改了模型属性,导致哈希值变化。
  • 是否不慎将同一个实例(或哈希值相同的不同实例)多次插入字典。

4. 确保SwiftData上下文操作安全

保存时避免并发修改上下文,比如不要在后台线程操作同一个上下文。另外,保存前可先判断context.hasChanges,再执行保存操作,减少不必要的上下文操作。


内容的提问来源于stack exchange,提问作者The-Wolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:27:06