Swift中使用.append初始化对象数组未达预期的原因解析
Swift对象数组初始化异常原因解析
在Xcode 15.0.1的Swift开发环境中,初始化Item类的对象数组时出现异常:所有数组元素均持有最后一个初始化对象的值。以下是两种不同写法及对应的结果:
无效写法
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中类是引用类型,变量存储的是对象在内存中的引用地址,而非对象本身。
- 无效写法里,你只创建了一个
Item实例,循环中每次修改的都是同一个实例的属性值,然后把这个实例的引用重复添加到数组里。数组里的三个元素其实指向内存中同一个对象,最后一次循环修改了该对象的属性,所以遍历数组时看到的都是最后一次修改后的结果。 - 有效写法里,每次循环都通过
Item("naam\(i)", "datum\(i)")创建了新的Item实例,每个实例都有独立的内存地址,数组元素分别指向不同对象,自然能保留各自的属性值。
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

