SwiftData:为已有模型添加UUID时所有实例ID重复问题
SwiftData迁移后历史实例UUID重复问题解决
问题原因
在模型V2中,wordId的默认值UUID()是在类定义阶段执行一次的,SwiftData轻量迁移时会把这个预先生成的单一UUID赋值给所有历史实例,导致旧数据的UUID完全相同。
解决方案
将wordId的默认值改为闭包延迟生成,让每个实例(包括迁移的旧实例)都能独立生成唯一UUID:
@Model class Word { // 用闭包延迟生成UUID,每个实例初始化时都会执行一次 var wordId: UUID = { UUID() }() private(set) var term: String = "" init(wordId: UUID, term: String) { self.wordId = wordId self.term = term } // 保留原初始化方法,兼容旧代码与迁移逻辑 init(term: String) { self.term = term } }
说明
- 闭包形式的默认值会在每个实例初始化(包括迁移过程中创建旧实例的内存对象)时执行,因此每个历史实例都会得到唯一的UUID。
- 保留原
init(term: String)方法可以避免代码兼容问题,同时让SwiftData在迁移时正确初始化旧实例。
内容的提问来源于stack exchange,提问作者Prec99
相关产品推荐
相关产品推荐

