我有一个结构数组,我正在反向枚举,当我遇到预期的元素时,我想更新元素的值。在将元素类型保持为结构时,有没有办法做到这一点?
struct MyModel {
var name
mutating func updateName(newName: String) {
self.name = newName
}
}
在另一个类中,我有一个我的模型类数组声明如下:
var array: Array<MyModel> = []
我已经填充了数组的内容,使得它的计数&gt; 0.我想从数组的尾端找到元素,并在遇到它们时更新它们。
func updateElement() {
let newName = "Some Name"
let reversedArray = array.reverse()
for (index, element) in reversedArray.enumerate() {
var el = reversedArray[reversedArray.startIndex.advancedBy(index)]
el.updateName(name: newName)
}
// This does not show the array as having updated contents
print(array)
}
如何通过枚举来更新数组?我不想删除或插入新元素。
答案 0 :(得分:1)
Swift Array
s - 以及struct
s - 是值类型。
分配给el
的项目是数组中原始结构的副本,因此您必须在更改后再写入该项目。
...
for (index, element) in reversedArray.enumerate() {
let elIndex = reversedCmdList.startIndex.advancedBy(index)
var el = reversedCmdList[elIndex]
el.updateName(name: newName)
reversedCmdList[elIndex] = el
}
...
答案 1 :(得分:0)
reversedArray包含原始数组元素的副本(结构被复制)。如果您打印(reversedArray),那么您将看到更改。您可以考虑让updateElement()将reverseArray分配给数组引用。
答案 2 :(得分:0)
结构是值类型。这意味着它们在传递时被复制。您无法修改结构数组(数组本身就是结构)。您创建一个具有所需值的新结构数组。这是映射。除了有更新数字3的方法之外,没有更新数据“就地”更新。它们都是值。 (Swift的优化通常会使所有这些复制相当便宜,但并非总是如此。)
目前还不清楚为什么要以相反的顺序执行此操作,但是您可以按照以下方式执行此操作:
func updateElement() {
let newName = "Some Name"
array = array.reverse().map {
var element = $0
element.updateName(newName)
return element
}.reverse()
print(array)
}
这会反转数组,通过更新名称将其映射到新数组,然后将其反转并将其分配给原始属性。
如果你可以解释为什么这对反向做有用,我们可能会提出一个更好的解决方案,因为这里的双反无效。