在 swift 中使用 .append 初始化对象数组并不像我预期的那样工作

问题描述 投票:0回答:1

在 Swift (Xcode 15.0.1) 中初始化对象数组时,所有对象都包含最后一个初始化对象的值。使用不同的初始化方式是有效的,但我无法弄清楚所有het对象似乎都是相同的原因。

我的班级的定义:

class Item: NSObject {
    var naam: String
    var datum: String
    
    override init(){
        naam = ""
        datum = ""
    }
    
    init(_ naam: String, _ datum: String){
        self.naam = naam
        self.datum = datum
    }
}

什么不起作用:

var item = Item()
  
for i in 0...2 {
    item.naam = "naam\(i)"
    item.datum = "datum\(i)"
    items.append(item)
}
        
for i in items {
    print(i.naam, i.datum)
}

结果:

    naam2 datum2
    naam2 datum2
    naam2 datum2

什么有效:

var item = Item()
  
for i in 0...2 {
    item.naam = "naam\(i)"
    item.datum = "datum\(i)"
    items.append(Item("naam\(i)", "datum\(i)"))
}
        
for i in items {
    print(i.naam, i.datum)
}

结果:

    naam0 datum0
    naam1 datum1
    naam2 datum2
swift oop initialization
1个回答
0
投票

它是参考语义。

当您在 for 循环外部创建一个项目,然后将其直接附加到数组中时,您实际上传递的是

Item
的单个实例,它们指向相同的地址,而您只是替换它们的值。您可以通过打印出其内存地址来检查它。

for i in items {
    print(Unmanaged.passUnretained(i).toOpaque())
}

第一种情况(不起作用):

0x0000600001615dd0
0x0000600001615dd0
0x0000600001615dd0

第二种情况(有效)。您正在创建 3 个不同的

Item
实例,并且对外部
item
实例不执行任何操作,这是正确的。

0x0000600002364b40
0x0000600002364f90
0x00006000023647e0
© www.soinside.com 2019 - 2024. All rights reserved.