我打算使用类对象变量来捕获循环周期中用户输入的数据集,当数据集完成时,将其添加到包含所有这些类变量的数组中。 操场上的简单示例代码:
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
似乎数组本身保存变量(指针?)而不是变量的副本,因此这在数组中不断变化。任何想法如何在不更改数组成员的情况下“重置”类变量?
答案 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
,你应该在将它附加到数组之前用你想要的数据创建一个新实例。