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

Swift中如何在UITableView的numberOfRowsInSection获取字典对应key的数组元素数

实现对应section数组元素个数获取方法

Swift中的字典[Int: [TaskEntity]]是无序结构,你需要先对key做升序排序,让排序后的key下标与tableView的section索引一一对应,再通过对应key获取数组长度即可,完整实现代码如下:

// 建议单独缓存排序后的key,避免每次代理方法重复排序
var sortedTaskKeys: [Int] = []
var tasks = [Int :[TaskEntity]]()

// 实现分组数代理方法
func numberOfSections(in tableView: UITableView) -> Int {
    return sortedTaskKeys.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // 安全校验,避免数组越界
    guard section < sortedTaskKeys.count, let taskList = tasks[sortedTaskKeys[section]] else {
        return 0
    }
    return taskList.count
}

每次修改tasks字典后,同步更新排序key再刷新列表:

sortedTaskKeys = tasks.keys.sorted()
tableView.reloadData()
打印结果异常原因与解决方案

原因

你看到的多次打印是tableView代理的正常调用逻辑:

  1. 第一次输出空key数组是tasks字典还未完成赋值时,tableView初始加载触发的代理回调
  2. 给tasks新增key后调用刷新方法,会触发第二次代理回调,此时字典已经有对应key
  3. 新增第1个section后字典包含2个key,tableView会依次查询所有存在的section的行数,所以会依次输出section=1和section=0的日志

解决方案

  • 所有对tasks字典的修改操作完成后,再执行tableView的刷新逻辑,避免修改前触发无效回调
  • 优先使用局部刷新代替全局reloadData减少不必要的代理调用,新增分组时使用以下代码:
tableView.insertSections(IndexSet(integer: newSectionIndex), with: .automatic)
  • 若不需要调试时关闭print语句即可,该调用逻辑本身不会影响功能正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:05