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

Swift中TableView动态生成的datestamp日期分区如何按降序排序

问题核心原因

  • 你写的self.sections.sorted { $0.date > $1.date }没有生效,是因为Swift中sorted()方法是返回新的排序后数组,不会修改原数组,你没有把排序结果赋值回self.sections,所以自然没有效果。
  • 另外你之前对self.structure排序的时机不对:排序写在了解码JSON之前,此时structure还是空数组,这行排序代码完全没有作用。
  • 分组后你拿到的keys默认是升序排序,直接用的话就是旧日期在最上面,改成降序即可实现新日期在前。

修正后的代码

直接修改fetchJSON中分组后的处理逻辑即可:

private func fetchJSON() {
    
    guard let url = URL(string: "test.com")
    else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = "id=1".data(using: .utf8)

    URLSession.shared.dataTask(with: request) { data, _, error in
        guard let data = data else { return }
                
        do {
            let decoder = JSONDecoder()
            let res = try decoder.decode([myStructure].self, from: data)
            // 先给解码出来的数据集按datestamp倒序,保证每个分区内的条目也是新的在前
            let sortedRes = res.sorted { $0.datestamp > $1.datestamp }
            // 分组
            let grouped = Dictionary(grouping: sortedRes, by: { $0.datestamp })
            // 这里给日期key做倒序排序,最新的日期在最前面
            let keys = grouped.keys.sorted(by: >)
            // 生成sections
            self.sections = keys.map({ mySections(date: $0, items: grouped[$0]!) })
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
        catch {
            print(error)
        }
    }.resume()
}

补充说明

你的日期格式是年-月-日的字符串格式,直接用字符串大小比较是完全可行的,不需要额外转成Date类型,因为高位的年份数字权重最高,其次是月份,最后是日期,比较逻辑和日期先后逻辑完全一致。
如果后续你日期格式调整为月/日前补0的格式(比如2021-11-03),这个比较逻辑也依然适用。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:00