Swift Data关联异常:重启App后多任务共享标签丢失
Swift Data多对多关联问题解决
你的问题出在没有正确定义多对多关联关系,Swift Data默认的数组关联会被处理成独占式的一对多关系,导致同一个Tag只能被最后一个关联的Task持有,重启后之前的关联就丢失了。
修正步骤:
- 修正模型类型错误:Task类中
tags: [Tags]的类型错误,应该是[Tag](你的模型类是Tag,不是Tags)。 - 添加双向多对多关联声明:在两个模型类中用
@Relationship明确关联关系和反向引用,确保Tag可以被多个Task关联,Task也可以关联多个Tag。
修正后的模型代码:
@Model class Tag { var id: UUID var title: String = "" var color: Int = 0xFFFFFF // 声明与Task的反向多对多关联,删除Tag时仅移除关联,不删除Task @Relationship(deleteRule: .nullify, inverse: \Task.tags) var tasks: [Task] = [] init(title: String, color: Int) { self.id = UUID() self.title = title self.color = color } } @Model class Task { var id: UUID = UUID() var title: String = "" // 声明与Tag的多对多关联,删除Task时仅移除关联,不删除Tag @Relationship(deleteRule: .nullify, inverse: \Tag.tasks) var tags: [Tag] = [] init(title: String, tags: [Tag] = []) { self.title = title self.tags = tags } }
关键说明:
@Relationship的inverse参数必须指定反向关联的属性,这样Swift Data才能正确识别多对多关系。deleteRule: .nullify表示删除其中一方时,仅移除两者的关联,不会删除关联的对象(如果需要级联删除可以改成.cascade,但多对多场景下一般用.nullify更合理)。
修改后重新运行App,同一个Tag被多个Task关联的情况就可以正常持久化,重启后不会丢失关联。
内容的提问来源于stack exchange,提问作者Root Root
相关产品推荐
相关产品推荐

