Swift. Невозможно изменить свойство структуры, полученный массив форм - PullRequest
0 голосов
/ 11 мая 2019

У меня проблема с обновлением массива общих структур, которые в приведенном ниже примере равны [SelectableItem].

Быстрый 40-секундный видеоэкран с проблемой.

Итак, у меня есть UITableView с источником данных [SelectableItem].В первый раз, когда я запускаю этот массив, где я указываю имя и выбранные состояния, табличное представление показывает данные правильно.Но когда я пытаюсь выбрать SelectableItem и переключить isSelected Bool состояние в true и перезагрузить данные, свойство source SelectableItem isSelected по-прежнему false, когда ячейка пытается получить его через тот же getModelAt func.

protocol Selectable {
    var isSelected: Bool { get set }
}

struct SelectableItem: Selectable {

    var isSelected: Bool
    let name: String
}

func getModelAt(_ indexPath: IndexPath) -> T {
        return isSearchActive ? searchResults[indexPath.item] : models[indexPath.item]
    }

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
        if var model = strongDataSource?.getModelAt(indexPath) {
            model.isSelected = !model.isSelected
            tableView.reloadData()
        }
    }

в этой строке model.isSelected = !model.isSelected все идет хорошо, и я вижу название модели и как model.isSelected переключился на другое значение (например, с ложного на истинное и с истинного на ложное).

Мое предположение, что, поскольку я использую структуры вместо классов, возможно, мой getModelAt возвращает мне модель по значению из массива, а не по ссылке.Но я не уверен на 100%.Или, может быть, что-то не так с Protocol get set

Не уверен, будет ли полезно понять мой вопрос, но я использовал эту ссылку для реализации функции поиска, и я просто расширил ее с помощью функции выбора.Так что все работает хорошо, за исключением присвоения новых значений для isSelected свойства экземпляра структуры.

1 Ответ

1 голос
/ 11 мая 2019

Для присвоения struct означает, что копирование и изменение не влияют на основную ссылку

if var model = strongDataSource?.getModelAt(indexPath) {

так что вам нужно сделать SelectableItem класс

...