知识卡片

值语义与引用语义的本质区别

专业/工作 · 752

内容

把一个实例赋给新的常量/变量、或作为参数传给函数时,值类型(结构体、枚举、Int/String/Array等标准库类型)会产生一份独立副本,修改新实例不影响旧实例;引用类型(类)则只是让新变量指向内存中同一个底层实例,通过任意一个变量修改都会反映到所有指向它的变量上。标准库把ArrayDictionaryIntString这些最基础的类型全部实现成结构体而非类,这个选择本身就是在向开发者宣告值类型在Swift里的地位——默认应该用值类型建模数据,只有明确需要共享可变状态(引用语义)时才用类。发散:这条准则和[[let优先于var的不可变默认]]、[[整数溢出默认触发陷阱]]是同一种”默认更可预测、按需才引入复杂性”的语言哲学在不同维度的体现。

参考来源

《Swift编程权威指南》第18章《值类型与引用类型》