2017-08-16 252 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,這取決於你需要什麼。