ios - 组数组以在 Swift 中向 UITableView 引入部分
问题描述
我有以下课程:
ChatMessage: Codable {
var id: Int?
var sender: User?
var message: String?
var seen: Int?
var tsp: Date?
}
tsp 的格式如下:YYYY-MM-DD hh:mm:ss
我想对同一天发送的消息进行“分组”,最终得到如下示例:
let groupedMessages = [ [ChatMessage, ChatMessage], [ChatMessage, ChatMessage, ChatMessage] ]
我最终想在 UITableViewController 中使用 groupedMessages 来介绍如下部分:
func numberOfSections(in tableView: UITableView) -> Int {
return groupedMessages.count
// would be 2 int the above
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return chatMessages[section].count
// would be 2 for the first and 3 for the second section
}
完成排序的最高效方式是什么?- 即,一旦要排序的聊天消息数量增加,它也能正常工作
解决方案
你可以试试:
let cal = Calendar.current
let groupedMessages = Dictionary(grouping: self.chatMessages, by: { cal.startOfDay($0.tsp) })
let keys = groupedMessages.keys.sorted(by: { $0 > $1 })
然而,这会给你一个像这样的字典:
[
SomeDateHere: [
ChatMessage(id: 0, sender: User?, message: "String", seen: 1),
ChatMessage(id: 0, sender: User?, message: "String", seen: 1)
],
AnotherDateHere: [
ChatMessage(id: 0, sender: User?, message: "String", seen: 1)
]
然后,您可以使用键返回节数:
return keys.count
并获取每个字典项的消息数组,如下所示:
let key = keys[indexPath.section]
let messages = groupedMessages[key].sorted(by: { $0.tsp > $1.tsp })
或仅获取计数:
let key = keys[indexPath.section]
return groupedMessages[key].count
推荐阅读
- amazon-web-services - 为联合身份 AWS 创建长期凭证
- javascript - JS 正则表达式字符串不会以句点/点结尾
- python - Python对象相等比较
- java - 从数据库中提取值进行操作并将它们保存在另一个表中 android
- r - 如何使用逆 CDF 方法从逻辑 CDF 生成样本
- jpa - JPA 问题:持久化具有 EmbeddedId 复合键的关联类时遇到问题
- javascript - 为什么一段代码会覆盖另一段代码?
- python - Sqlite中的变量使用python
- git - 强制 Git 总是覆盖某些文件
- javascript - 将 Class 样式复制到另一个元素而不更改它的类