Прежде всего, если вы все равно принудительно развернете ячейку, сделайте это в строке dequeue
, чтобы избежать ненужного количества вопросительных знаков, и используйте API для возврата необязательной ячейки
let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell", for: IndexPath) as! SmsTableViewCell
.исправьте проблему, обновите свойство selected
структуры ContactsModel
напрямую и забудьте о дополнительном массиве selectedCells
.Далее объявляем - по крайней мере - selected
как необязательные, практически нет состояния возможно .И объявить также все массивы источников данных (data
/ contacts
) как необязательные, cellForRow
вызывается только в том случае, если по умолчанию имеется элемент в определенном indexPath.
struct ContactsModel : Codable {
...
var selected : Bool
...
}
...
let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell", for: IndexPath) as! SmsTableViewCell
let contact = data[indexPath.section].contacts[indexPath.row]
cell.PhonNumberLbl.text = contact.phoneNumber
cell.NameLbl.text = contact.name
cell.selectedTF.isOn = contact.selected
cell.switchHandler = { [unowned self] switchState in
// as the structs are value types you have to specify the full reference to the data source array
self.data[indexPath.section].contacts[indexPath.row].selected = switchState
}
в этом случае используйте классы, а не структуры, тогда вы можете сократить замыкание
cell.switchHandler = { switchState in
contact.selected = switchState
}