Изменение значения в массиве - PullRequest
1 голос
/ 01 мая 2020

При выборе пользовательской ячейки значение элемента Bool должно измениться с истинного на ложное или наоборот. Вы можете узнать, когда была выбрана ячейка с использованием метода didSelectItemAt в протоколе UICollectionViewDelegate.

Это то, что инструктор просит нас сделать.

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        var item = shoppingListController.shoppingItems[indexPath.item]

        item.itemHasBeenAdded = true
}

this это то, что я имею до сих пор.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете написать свой код для изменения значения Boolean на противоположное значение при выборе, например, так:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        var item = shoppingListController.shoppingItems[indexPath.item]

        item.itemHasBeenAdded = !item.itemHasBeenAdded
}

Редактировать: как сказал арт-сон, этот код будет производить тот же эффект :

item.itemHasBeenAdded.toggle()
0 голосов
/ 01 мая 2020

Будьте осторожны с этим шаблоном:

var item = shoppingListController.shoppingItems[indexPath.item]
item.itemHasBeenAdded = true

Это будет работать, если ваш элемент в вашем массиве имеет ссылочный тип (т. Е. class), так как item будет ссылаться на экземпляр, который является в массиве. Но если это тип значения (то есть struct), эта локальная переменная item в конечном итоге станет копией объекта, и вы в конечном итоге измените itemHasBeenAdded в этой копии, а не обновите элемент в вашем массив.

Если это struct, теоретически вы можете скопировать элемент обратно, например,

var item = shoppingListController.shoppingItems[indexPath.item]
item.itemHasBeenAdded.toggle()
shoppingListController.shoppingItems[indexPath.item] = item

Обратите внимание, вы сказали, что хотите «изменить с истинного на ложное или наоборот». Versa». В этом случае я использую toggle для переключения назад и вперед с true на false и обратно.

Или, проще, просто обновите элемент в массиве напрямую, который будет работать независимо является ли это ссылочным типом или типом значения, например

shoppingListController.shoppingItems[indexPath.item].itemHasBeenAdded.toggle()

Нет необходимости говорить, что это предостережение относительно локальной переменной item применимо, только если элементы в вашем массиве сами являются типами значений ( struct). Если это class, вы будете в порядке в любом случае. Но вы все равно захотите использовать toggle, чтобы этот метод переключал Bool вперед и назад.

...