将对象附加到对象数组

时间:2017-08-16 22:49:44

标签: arrays swift

当我将一个新对象追加到一个对象数组上时,我得到了一个意想不到的结果。 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

4 个答案:

答案 0 :(得分:1)

这显然是因为class参考类型。如果您创建类的对象意味着您正在创建该class的内存引用。如果您是class的更改属性,则表示您正在更改内存堆中该引用的值。这就是为什么你的最后一个对象(即Jane Doe)正在替换第一个Object的值(即John Brown)。

所以现在在Array中,两个元素都引用相同的内存引用,这就是为什么你得到两个相同的对象(即Jon Doe)。如果您将实现更改为struct,则根据您的实施情况获得答案,因为struct 值类型。所以它只指对象的价值。

更多指定关于类和结构请阅读此link

答案 1 :(得分:0)

当您重新分配tempRecord.firstNametempRecord.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,取决于你需要的东西。