无法分配给属性:“$0”是不可变的

Mer*_*sal -1 didselectrowatindexpath swift

我的表格视图中有默认选择的单元格。我想在点击时更改此选定的语言,但无法这样做。我在“$0”行收到错误:

var languageViewModel = LanguageViewModel()
var languageTitles: [LanguageModel] = []
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var item = languageTitles[indexPath.row]
    var value = item.isSelected
    // Edit isSelected property and refresh table
    languageTitles.forEach { $0.isSelected = false  }
    item.isSelected = !value
    tableView.reloadData()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    return languageCell(indexPath: indexPath)
}
private func languageCell(indexPath: IndexPath) -> LanguageTableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: LanguageTableViewCell.identifier, for: indexPath) as! LanguageTableViewCell
    let item = languageTitles[indexPath.row]
    if item.isSelected {
        cell.setupSelected(item)
    } else {
        cell.setup(item)
    }
    return cell
}
Run Code Online (Sandbox Code Playgroud)
struct LanguageModel {
    let language: Language
    var isSelected: Bool = false
}
Run Code Online (Sandbox Code Playgroud)
class LanguageViewModel {
    var locales: [Language] = [.tr, .eng, .az] //.ar
    var currentLanguage = UserDefaultsUtil.getDeviceLanguage()
    var languages: [LanguageModel] = []
    func getLanguageTitles() {
        languages = [
            LanguageModel(language: .tr, isSelected: currentLanguage == locales[0].code),
            LanguageModel(language: .eng, isSelected: currentLanguage == locales[1].code),
            LanguageModel(language: .az,  isSelected: currentLanguage == locales[2].code)
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

当我想更改语言时,我无法点击另一个单元格。它始终是从视图模型中选择的一个

如果我将 didselectrowat 更改为

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var item = languageTitles[indexPath.row]
    var value = item.isSelected
    // Edit isSelected property and refresh table
    for languageTitle in languageTitles {
        languageTitle.isSelected = false
    }
    item.isSelected = !value
    tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)

无法分配给属性:“languageTitle”是“let”常量

在此输入图像描述

Rob*_*ier 12

替换这个:

        languageTitles.forEach { $0.isSelected = false  }
Run Code Online (Sandbox Code Playgroud)

和:

for index in languageTitles.indices {
    languageTitles[index].isSelected = false
}
Run Code Online (Sandbox Code Playgroud)

forEach有各种微妙而令人惊讶的行为。通常最好使用 afor-in代替。但关键问题是它LanguageModel是一个结构体并且具有值语义。当您将其分配给变量(即 $0,或 for-in 循环中的变量)时,会创建一个副本。如果您对副本进行更改,它们不会修改数组。(默认情况下,它们是常量,因此您无论如何都无法修改它们。)但是,通过下标运算符进行分配可以满足您的期望。