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
相关产品推荐
相关产品推荐

