如何解决如何写入集合中的元素?
使用数组,您可以使用下标直接访问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在其答案中的解释进行操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。