将对象追加到对象数组
问题描述:
当我将新对象追加到对象数组时,会出现意外的结果。附加似乎覆盖数组中的现有对象,然后附加它自己。将对象追加到对象数组
有什么想法?或者我错过了一些非常简单的事情。
下面是测试代码,从我的游乐场:
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
答
当您重新分配tempRecord.firstName
和tempRecord.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)
答
这很明显是因为class
是参考类型。如果你创建的类的对象意味着你正在创建那个class
的内存引用。如果你是class
的改变属性,这意味着你正在改变你的内存堆中的引用的值。那就是为什么你的最后一个对象(即Jane Doe)正在取代第一个对象(即John Brown)的价值。
所以,现在在Array中,两个元素都指向同一个内存引用,以表示为什么同时获得两个对象(即Jon Doe)。如果您将执行更改为struct
,则会根据您的实施情况获得答案,因为结构为值类型。所以它只涉及对象的价值。
更指定有关class和struct请仔细阅读本link
答
只需更换“类”与“结构”作为类是引用类型和结构是值类型。
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!) }
答
只是把后
tempRecord.firstName = "John"
tempRecord.lastName = "Brown"
myRecords.append(tempRecord)
tempRecord = myRecords()
再加入李四。
你可以使用Struct而不是Class,这取决于你需要什么。
是的,因为你一直在改变'tempRecord' – Lamar
这个相同对象的值@Lamar说的。该数组具有该内存中该对象的地址。如果更新该对象的字节,该数组仍然具有与该对象相同的地址,但该地址处的内容已更改。 – mdo123
你解决了你的问题吗? – Jaydeep