SwiftData查询:如何对主模型的Items属性数组按日期排序
解决SwiftData中关联数组的排序问题
问题分析
你尝试通过TaskItems.items.date排序Item实例的写法错误,因为FetchDescriptor<Item>的排序描述符必须直接指向Item模型自身的属性,而非通过关联模型的嵌套路径。
解决方案
场景1:查询所有Item并按date排序
如果需要获取所有Item实例并按date字段排序,直接使用Item的属性路径即可:
@Query(FetchDescriptor<Item>(sortBy: [SortDescriptor(\.date, order: .forward)])) var items: [Item]
场景2:针对单个TaskItems实例的items排序
如果是要对某个具体TaskItems对象下的items数组排序,无需额外的@Query,可在拿到目标taskItem后对其items直接排序:
// 假设已获取到目标taskItem实例 if let sortedItems = taskItem.items?.sorted(by: { $0.date < $1.date }) { // 使用排序后的sortedItems数组 }
优化建议
如果希望每次获取TaskItems的items时默认都是有序的,可以在模型中添加计算属性封装排序逻辑:
@Model final class TaskItems { @Attribute(.unique) var name: String @Relationship(deleteRule: .cascade) var items: [Item]? // 计算属性:返回按date升序排列的items var sortedItems: [Item] { items?.sorted(by: { $0.date < $1.date }) ?? [] } init(name: String, items: [Item]? = nil) { self.name = name self.items = items } }
之后在View中直接调用taskItem.sortedItems就能拿到有序数组。
内容的提问来源于stack exchange,提问作者RXP
相关产品推荐
相关产品推荐

