You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:50