2017-08-16 159 views
0

当我将新对象追加到对象数组时,会出现意外的结果。附加似乎覆盖数组中的现有对象,然后附加它自己。将对象追加到对象数组

有什么想法?或者我错过了一些非常简单的事情。

下面是测试代码,从我的游乐场:

class myRecord { 

    var firstName: String? 
    var lastName: String? 
    } 

var myRecords = [myRecord]() 
var tempRecord = myRecord() 


tempRecord.firstName = "John" 
tempRecord.lastName = "Brown" 
myRecords.append(tempRecord) 

tempRecord.firstName = "Jane" 
tempRecord.lastName = "Doe" 
myRecords.append(tempRecord) 

for x in 0..<myRecords.count { 
    print(x, "=", myRecords[x].firstName!, myRecords[x].lastName!) } 

Console output: 
0 = Jane Doe 
1 = Jane Doe 
+1

是的,因为你一直在改变'tempRecord' – Lamar

+0

这个相同对象的值@Lamar说的。该数组具有该内存中该对象的地址。如果更新该对象的字节,该数组仍然具有与该对象相同的地址,但该地址处的内容已更改。 – mdo123

+1

你解决了你的问题吗? – Jaydeep

回答

0

当您重新分配tempRecord.firstNametempRecord.lastName值时,它在myRecords阵列等于您设置的新值的指数0改写值。

索引0和myRecords阵列的索引1都指向同一tempRecord类实例在存储器,其保持值

{ firstName: Jane, lastName: Doe }

为了添加myRecord类的多个实例,则可以创建一个单独的实例称为tempRecords1和值追加到myRecords阵列像这样:

... 

var tempRecord = myRecord() 
var tempRecord1 = myRecord() 

... 

tempRecord1.firstName = "Jane" 
tempRecord1.lastName = "Doe" 
myRecords.append(tempRecord1) 
1

这很明显是因为class参考类型。如果你创建的类的对象意味着你正在创建那个class的内存引用。如果你是class的改变属性,这意味着你正在改变你的内存堆中的引用的值。那就是为什么你的最后一个对象(即Jane Doe)正在取代第一个对象(即John Brown)的价值。

所以,现在在Array中,两个元素都指向同一个内存引用,以表示为什么同时获得两个对象(即Jon Doe)。如果您将执行更改为struct,则会根据您的实施情况获得答案,因为结构为值类型。所以它只涉及对象的价值。

更指定有关class和struct请仔细阅读本link

0

只需更换“类”与“结构”作为类是引用类型和结构是值类型。

struct myRecord { 

    var firstName: String? 
    var lastName: String? 
} 

var myRecords = [myRecord]() 
var tempRecord = myRecord() 


tempRecord.firstName = "John" 
tempRecord.lastName = "Brown" 
myRecords.append(tempRecord) 

tempRecord.firstName = "Jane" 
tempRecord.lastName = "Doe" 
myRecords.append(tempRecord) 

for x in 0..<myRecords.count { 
    print(x, "=", myRecords[x].firstName!, myRecords[x].lastName!) } 
0

只是把后

tempRecord.firstName = "John" 
tempRecord.lastName = "Brown" 
myRecords.append(tempRecord) 

tempRecord = myRecords() 

再加入李四。

你可以使用Struct而不是Class,这取决于你需要什么。