如何在swift中重新使用变量来构建数组

时间:2014-09-29 20:19:29

标签: ios iphone arrays swift

我打算使用类对象变量来捕获循环周期中用户输入的数据集,当数据集完成时,将其添加到包含所有这些类变量的数组中。 操场上的简单示例代码:

class Example {
    var a = 1
    var b = 5
}

var exArray = [Example] () //  this is the array holding the class variables
var anExample = Example () // default-init the "re-usable" variable

exArray.append(anExample)

exArray[0].a // results in 1 as expected
exArray[0].b //  results in 5 as expected
exArray.count // 1 as expected

// now changing the re-usable variable properties with new user entered data

anExample.a = 3
anExample.b = 7

// appending the altered variable

exArray.append(anExample)

exArray[0].a // shows 3 where I still expect 1
exArray[0].b // shows 7 where I expect 7
exArray.count // shows 2 as expected

似乎数组本身保存变量(指针?)而不是变量的副本,因此这在数组中不断变化。任何想法如何在不更改数组成员的情况下“重置”类变量?

2 个答案:

答案 0 :(得分:2)

如果创建类的实例并分配给变量,则该变量包含对实例的引用,而不包含实例本身。

将变量添加到数组时,可以添加对类实例的引用。如果稍后更改实例属性并添加到数组,则添加之前添加的相同引用。结果:插入到数组中的所有内容都是包含对同一个类实例的引用的变量。

根据您的应用程序体系结构和逻辑,您可能希望将类转换为结构 - 与类(参考类型)不同,结构是值类型,因此当它移动时,它的副本是创建。这种情况发生在:

  • 您将变量分配给另一个变量
  • 您将其传递给函数或方法(除非使用inout修饰符)

直接的结果是,如果将一个struct实例插入一个数组中,就会调用一个方法,因此会创建一个struct的副本并将其插入到数组中 - 该副本与原始结构没有关系,除了具有复制时的相同值。所以你对其中任何一个做的任何改变,都不会反映到另一个。

答案 1 :(得分:2)

如果您希望在分配数据时复制数据,则可以将Example定义为struct而不是class See this answer for the difference between struct and class

struct Example {
    var a = 1
    var b = 5
}

现在,当您将其分配给数组时,它会将副本添加到数组中,并在您指定数据的位置添加数据。


但是如果你想继续使用class,你应该在将它附加到数组之前用你想要的数据创建一个新实例。