首页 > 解决方案 > 组数组以在 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
    }

完成排序的最高效方式是什么?- 即,一旦要排序的聊天消息数量增加,它也能正常工作

标签: iosarraysswiftuitableviewgrouping

解决方案


你可以试试:

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

推荐阅读