Swift向数组添加元素时实际追加的是副本而非引用吗?
问题根因
该现象的核心原因是 Swift 中结构体(struct)属于值类型,遵循值传递语义,和类(class)的引用传递逻辑完全不同。
代码执行逻辑拆解
- 自定义的
test是结构体类型,初始化变量t后,系统分配独立内存存储t的属性,此时itest初始值为nil。 - 执行
tests.append(t)操作时,值类型的传递规则会触发完整拷贝:将t当前的所有属性值复制一份存入数组内存,数组内的实例和原变量t是完全独立的两个内存对象,没有引用关联。 - 后续修改
t.itest = 99时,仅修改了原变量t对应内存的属性值,数组内的拷贝实例不受任何影响,因此两次打印结果分别为nil和Optional(99)。
补充说明
如果需要实现数组存储引用、修改原变量同步影响数组内实例的效果,将test的声明从struct改为class即可,修改后两次打印结果均为Optional(99)。
// 修改为引用类型的示例 class test { var itest: Int?; }
内容的提问来源于stack exchange,提问作者frameworker
相关产品推荐
相关产品推荐

