当我将一个新对象追加到一个对象数组上时,我得到了一个意想不到的结果。 append似乎覆盖了数组中的现有对象,然后追加自身。
有什么想法?或者我错过了一些非常简单的事情。
这是我操场上的测试代码:
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
答案 0 :(得分:1)
这显然是因为class
是参考类型。如果您创建类的对象意味着您正在创建该class
的内存引用。如果您是class
的更改属性,则表示您正在更改内存堆中该引用的值。这就是为什么你的最后一个对象(即Jane Doe)正在替换第一个Object的值(即John Brown)。
所以现在在Array中,两个元素都引用相同的内存引用,这就是为什么你得到两个相同的对象(即Jon Doe)。如果您将实现更改为struct
,则根据您的实施情况获得答案,因为struct 值类型。所以它只指对象的价值。
更多指定关于类和结构请阅读此link
答案 1 :(得分:0)
当您重新分配tempRecord.firstName
和tempRecord.lastName
的值时,它会覆盖myRecords
数组的索引0处的值,以等于您设置的新值。
myRecords
数组的索引0和索引1都指向内存中保存值的同一tempRecord
类实例
{
firstName: Jane,
lastName: Doe
}
为了添加myRecord
类的多个实例,您可以创建一个名为tempRecords1
的单独实例,并将值附加到myRecords
数组,如下所示:
...
var tempRecord = myRecord()
var tempRecord1 = myRecord()
...
tempRecord1.firstName = "Jane"
tempRecord1.lastName = "Doe"
myRecords.append(tempRecord1)
答案 2 :(得分:0)
只需更换&#39; class&#39;与&#39;结构&#39; class是引用类型,struct是值类型。
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!) }
答案 3 :(得分:0)
刚刚放完
tempRecord.firstName = "John"
tempRecord.lastName = "Brown"
myRecords.append(tempRecord)
tempRecord = myRecords ()
然后添加jane doe。
你可以使用Struct而不是Class,取决于你需要的东西。