Swift值类型和引用类型

Swift中,基本类型(Array、Dictionary、Int、String等)都是值类型,它们都是用结构体实现的。在使用Swift时,应优先使用struct实现数据建模,只在需要的时候才使用class。

不能改变声明为常量的值类型实例的属性。

可以改变声明为常量的引用类型实例的属性。

Swift在语言层面没有提供深复制的支持,所以Swift中的复制是浅复制。

Swift对值类型的赋值行为会不会对性能产生影响?答案是取决于数据和用法。

Swift标准库中的值类型实现了写时复制(copy on write,COW)机制:

COW对值类型的底层存储的隐式共享。这种优化能够让某个值类型的多个实例共享同一个底层存储,也就是每个实例自己并不持有一份数据的副本;每个实例会维护自己对同一份存储的引用。如果某个实例需要修改或写入存储,那么这个实例就会产生一份自己的副本。

所以值类型能够避免创建多余的数据副本。