如何让SwiftData模型在指定集合内保持唯一性而非全局唯一?
SwiftData中实现集合内属性唯一而非全局唯一的问题
我正在学习在SwiftUI iOS应用中使用SwiftData框架进行数据存储,发现无法在SwiftData模型中直接使用Swift的Set,但需要实现类似Set的唯一性功能——要求同一台计算机下的目录路径不能重复,但不同计算机可以拥有相同路径的目录。
初始模型代码
@Model class Computer { // 计算机的序列号全局唯一 @Attribute(.unique) let serialNumber: String // 一台计算机可拥有多个目录 @Relationship(deleteRule: .cascade) var directories: [Directory] init(name: String, directories: [Directory] = []) { self.name = name self.directories = directories } } @Model class Directory { // 期望:同一台计算机下的目录路径唯一,但不同计算机可重复(当前未实现) @Attribute(.unique) let path: String // 一个目录可拥有多个文件 @Relationship(deleteRule: .cascade) var files: [File] init(path: String, files: [File] = []) { self.path = path self.files = files } }
期望实现的功能
- 创建两台计算机:Computer "A" 和 Computer "B"
- 为每台计算机分别创建"/home"目录
- 两个"/home"是
Directory的独立实例,各自可以存储不同的文件
遇到的问题
使用上述初始代码时,给Computer "A"添加"/home"目录可以正常执行,但给Computer "B"添加相同路径的目录时程序直接崩溃。
尝试的修改及新问题
我尝试给关系添加反向关联:
修改Computer模型的directories属性:
@Relationship(deleteRule: .cascade, inverse: \Directory.computer) var directories: [Directory]
并在Directory模型中添加:
var computer: Computer?
修改后,给Computer "B"添加"/home"目录不再崩溃,但会自动删除Computer "A"中同路径的Directory实例。
核心疑问
为什么会出现这种情况?SwiftData中是否支持实现仅在指定集合(比如某台计算机的目录列表)内保持属性唯一性,而非全局唯一?我没有找到相关的示例或官方文档说明。
内容的提问来源于stack exchange,提问作者fraune
相关产品推荐
相关产品推荐

