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

Swift 删除indexPath为0的Collection View Cell时数组越界如何解决

问题原因

  • 你的代码逻辑顺序完全颠倒:先移除了数组对应位置的元素,才尝试读取要删除的模型数据,且读取的下标用了错误的item-1,当要删除的item为0时,item-1 = -1直接触发数组越界崩溃。
  • 即使删除的不是第0个元素,先移除元素后读取的逻辑也会拿到错误的模型,因为数组元素移除后后续元素会自动前移,此时读取到的已经不是目标删除对象。

修复方案

调整执行顺序:先读取要删除的模型数据,完成云端删除操作后,再移除本地数组的对应元素,同时删掉错误的item-1下标逻辑。

修复后代码如下:

@IBAction func deleteItem(_ sender: Any) {
    guard let selectedCells = tablesCollectionView.indexPathsForSelectedItems, !selectedCells.isEmpty else {
        return
    }
    // 按倒序排列待删除下标,避免正序删除导致下标偏移出错
    let items = selectedCells.map { $0.item }.sorted().reversed()
    // 提前初始化数据库引用,不用放在循环里重复创建
    refTables = Database.database().reference().child("userInfo").child(uid!).child("tables")
    
    for item in items {
        // 先读取要删除的目标模型
        let tableNo = tables[item]
        // 先执行云端删除操作
        refTables.child(tableNo.id!).removeValue { error, arg  in
            if let error = error {
                print("error \(error)")
            }
        }
        // 最后移除本地数组对应元素
        tables.remove(at: item)
    }
    
    tablesCollectionView.deleteItems(at: selectedCells)
    deleteButton.isEnabled = false
}

额外优化说明

  • 把数据库引用的初始化移到循环外部,避免每次循环重复创建相同的引用对象,提升执行效率
  • 增加了空值判断提前退出的逻辑,避免后续无意义代码执行
  • 去掉了冗余的TableModel类型显式声明,Swift可自动推断类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:54:03