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
相关产品推荐
相关产品推荐

