更新struct类型的数组元素,同时反向枚举

时间:2016-07-07 16:21:14

标签: swift swift2

我有一个结构数组,我正在反向枚举,当我遇到预期的元素时,我想更新元素的值。在将元素类型保持为结构时,有没有办法做到这一点?

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)
}

如何通过枚举来更新数组?我不想删除或插入新元素。

3 个答案:

答案 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)
}

这会反转数组,通过更新名称将其映射到新数组,然后将其反转并将其分配给原始属性。

如果你可以解释为什么这对反向做有用,我们可能会提出一个更好的解决方案,因为这里的双反无效。