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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:07:07