更改数组中的值

Changing a value in an array

选择自定义单元格后,项目 Bool 值应从 true 更改为 false,反之亦然。通过使用 UICollectionViewDelegate 协议中的 didSelectItemAt 方法,您可以知道何时选择了一个单元格。

这是导师要求我们做的。

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

        var item = shoppingListController.shoppingItems[indexPath.item]

        item.itemHasBeenAdded = true
}

这就是我目前的情况。

您可以编写代码,在选择时将布尔值更改为相反的值,如下所示:

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

        var item = shoppingListController.shoppingItems[indexPath.item]

        item.itemHasBeenAdded = !item.itemHasBeenAdded
}

编辑:正如art-of-dreams所说,这段代码会产生同样的效果:

item.itemHasBeenAdded.toggle()

小心这个模式:

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

请注意,您说您想要“从 true 变为 false,反之亦然”。在这种情况下,我使用 toggletruefalse 之间来回切换。

或者,更简单,直接更新数组中的项,无论它是引用类型还是值类型都有效,例如

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

不用说,关于局部 item 变量的警告仅适用于数组中的项目本身是值类型(struct)的情况。如果它是 class,那么无论哪种方式都可以。但是您仍然希望使用 toggle 来让这个方法来回切换 Bool