Swift中如何基于结构体的_host字段对TableView条目进行分组并完善UITableView数据源方法?
解决UITableView按_host分组并展示分区标题的问题
首先,咱们得把数据处理逻辑捋顺:直接在数据源方法里重复分组会浪费性能,所以最好提前把数据分组并排序好,存成实例变量供各个方法调用。
第一步:添加分组数据的实例变量
在你的Ucet类里新增一个存储分组后数据的变量:
// 每个元素对应一个分区的(host标题, 该分区的数据数组) var groupedPolozky: [(host: String, items: [polozky])] = []
第二步:数据加载完成后执行分组+排序
当你拿到polozkyuctu数据(比如JSON解析完成)后,立即处理分组和排序:
// 1. 按_host字段对原始数据分组 let hostGroups = Dictionary(grouping: polozkyuctu, by: { $0._host }) // 2. 对分组的host排序(转成Int是为了让"10"排在"2"后面,符合你要的展示顺序) groupedPolozky = hostGroups.sorted { Int($0.key) ?? 0 < Int($1.key) ?? 0 }.map { (host: $0.key, items: $0.value) }
第三步:完善UITableViewDataSource的所有方法
现在可以用预处理好的groupedPolozky来填充各个数据源方法:
extension Ucet: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { // 直接返回分组的总数 return groupedPolozky.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 返回当前分区对应的数据数组长度 return groupedPolozky[section].items.count } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { // 拼接分区标题 return "Title \(groupedPolozky[section].host)" } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // 获取当前行对应的数据模型 let currentItem = groupedPolozky[indexPath.section].items[indexPath.row] // 设置cell显示的内容 cell.textLabel?.text = currentItem._recept return cell } }
补充说明
- 提前分组的原因:如果每次在
numberOfSections里重新分组,TableView滚动、刷新时都会重复计算,会影响性能,提前处理一次就足够了。 - 排序的必要性:Swift的
Dictionary是无序结构,默认分组后的顺序不一定符合你要的0→2→10的展示逻辑,所以我们把host转成Int后升序排序,保证分区顺序正确。 - 编码规范小建议:Swift里类型名应该采用大驼峰命名(比如把
polozky改成Polozky),这是官方推荐的编码规范,能让代码更易读易维护。
内容的提问来源于stack exchange,提问作者Codl
相关产品推荐
相关产品推荐

