如何写入集合中的元素?

问题描述

使用数组,您可以使用下标直接访问Array Element。您可以对其进行读写。对于Set,我不确定要编写其Elements的方法

例如,如果我访问与条件匹配的set元素,则只能读取该元素。它是通过副本传递的,因此我无法写成原件。

例如:


columns.first(
    where: { 
        $0.header.last == Character(String(i))
    }
)?.cells.append(value: addValue)


// ERROR: Cannot use mutating member on immutable value: function call returns immutable value

解决方法

由于how a (hash) set works,您不能只更改集合中的内容。更改它们可能会更改其哈希值,从而使该集合变为无效状态。

因此,您必须将要更改的东西从集合中取出,进行更改,然后放回原处。

if var thing = columns.first(
    where: { 
        $0.header.last == Character(String(i))
    }) {
    columns.remove(thing)
    thing.cells.append(value: addValue)
    columns.insert(thing)
}

如果==上的Column运算符不关心cells(即,向一列中添加单元格不会突然使两个原本相等的列不相等,反之亦然)您可以改用update

if var thing = columns.first(
    where: { 
        $0.header.last == Character(String(i))
    }) {
    thing.cells.append(value: addValue)
    columns.update(thing)
}

如您所见,这需要进行大量工作,因此在这种情况下,集可能不是合适的数据结构。您是否考虑过使用数组? :)

private var _columns: [Column]
public var columns : [Column] {
    get { _columns }
    set { _columns = Array(Set(newValue)) }
    // or any other way to remove duplicate as described here: https://stackoverflow.com/questions/25738817/removing-duplicate-elements-from-an-array-in-swift
}
,

您收到错误消息,因为columns可能是一组struct。因此columns.first将为您带来一个不变的价值。如果要使用class,则将从columns.first获得可变的结果,并且代码将按预期工作。 否则,您将必须按照@Sweeper在其答案中的解释进行操作。