在 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
它是参考语义。
当您在 for 循环外部创建一个项目,然后将其直接附加到数组中时,您实际上传递的是
Item
的单个实例,它们指向相同的地址,而您只是替换它们的值。您可以通过打印出其内存地址来检查它。
for i in items {
print(Unmanaged.passUnretained(i).toOpaque())
}
第一种情况(不起作用):
0x0000600001615dd0
0x0000600001615dd0
0x0000600001615dd0
第二种情况(有效)。您正在创建 3 个不同的
Item
实例,并且对外部 item
实例不执行任何操作,这是正确的。
0x0000600002364b40
0x0000600002364f90
0x00006000023647e0