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

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
    }
}

补充说明

  1. 提前分组的原因:如果每次在numberOfSections里重新分组,TableView滚动、刷新时都会重复计算,会影响性能,提前处理一次就足够了。
  2. 排序的必要性:Swift的Dictionary是无序结构,默认分组后的顺序不一定符合你要的0→2→10的展示逻辑,所以我们把host转成Int后升序排序,保证分区顺序正确。
  3. 编码规范小建议:Swift里类型名应该采用大驼峰命名(比如把polozky改成Polozky),这是官方推荐的编码规范,能让代码更易读易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:42:37