抱歉标题不好,我觉得这个问题真的很蠢。
我从我的表中删除了一个单元格并且第一个代码块运行得非常完美,但是当通过创建变量缩短行代码时代码崩溃了。为什么?
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
emojisByCategories[indexPath.section].remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}
这个小小的改动将导致" libc ++ abi.dylib:以NSException类型的未捕获异常终止 (LLDB)"错误
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
var emojis = emojisByCategories[indexPath.section]
emojis.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}
构建于Xcode版本9.0(9A235)
答案 0 :(得分:1)
你有一个数组数组。 Swift中的Array
是一个值类型的结构。将数组分配给另一个变量时,实际上是在创建该数组的副本。
当你这样做时:
var emojis = emojisByCategories[indexPath.section]
emojis.remove(at: indexPath.row)
您正在修改emojis
中的副本。 emojisByCategories
中的任何内容实际上都不会因此代码而被更改。
现在您告诉表视图已删除了一行,但您的数据源实际上并未实际更改,因此您会在崩溃时告诉您某个部分中的行数无效。
该行:
emojisByCategories[indexPath.section].remove(at: indexPath.row)
没有相同的问题,因为您没有复制任何数组,emojisByCategories
中的值正在按预期更新。
您可以通过添加第三行来使第二组代码工作:
var emojis = emojisByCategories[indexPath.section]
emojis.remove(at: indexPath.row)
emojisByCategories[indexPath.section] = emojis
第3行使用更新的emojisByCategories
数组更新emojis
,现在您的代码不会崩溃。