变量崩溃代码

时间:2017-09-16 23:35:14

标签: swift uitableview

抱歉标题不好,我觉得这个问题真的很蠢。

我从我的表中删除了一个单元格并且第一个代码块运行得非常完美,但是当通过创建变量缩短行代码时代码崩溃了。为什么?

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)

1 个答案:

答案 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,现在您的代码不会崩溃。