Swift数组追加异常:循环追加后所有数组元素值被覆盖
问题根源与解决方案
嘿,这个问题我太熟啦!你遇到的是Swift里引用类型的典型坑——你从头到尾只创建了一个people类的实例,数组里存的全是指向这个实例的引用,所以最后所有元素都会变成你最后一次修改的结果。
为什么会这样?
你在循环外面定义了var user = people(),这意味着整个循环过程中,user始终是同一个对象。每次循环里修改user.name和user.height,都是在修改这个唯一实例的属性,然后把它的引用追加到数组p里。数组里的每一项其实都是指向同一个user的“指针”,当你最后遍历数组时,这个实例的属性已经被改成了ryan和120,所以所有输出都是这个值。
怎么解决?
很简单,把people实例的创建放到循环内部,让每次循环都生成一个全新的实例:
let a = 2 class people { var name = " " var height = Int() } var p = [people]() for i in 0...a-1{ // 每次循环都新建一个people实例 var user = people() if(i==0){ user.name = "jack" user.height = 180 } else { user.name = "ryan" user.height = 120 } p.append(user) print(p[i].name, p[i].height); } for i in 0...a-1 { print(p[i].name, p[i].height); }
修改后运行,就能得到你预期的输出:
jack 180
ryan 120
jack 180
ryan 120
额外小提示
如果你的people不需要继承或者引用语义,也可以把它改成值类型的struct,这样即使复用变量,每次赋值也会创建副本,同样能解决问题:
struct people { var name = " " var height = Int() }
内容的提问来源于stack exchange,提问作者Jaison Thomas
相关产品推荐
相关产品推荐

