知识卡片
值类型内嵌引用类型会破坏复制直觉
内容
值类型内部持有引用类型属性时,[[值语义与引用语义的本质区别]]会出现一个反直觉的裂缝:把这个值类型实例赋给新变量,确实会得到一个新的顶层副本,但副本内那个引用类型属性仍然和原实例共享同一个底层对象——修改这个内部对象的属性,会同时影响”两个独立的”值类型副本,因为它们内部指向的其实是同一份数据(浅复制)。真正各自独立、互不影响的深复制,Swift没有语言层面的默认支持,需要开发者自己实现。因此书中建议:除非确有必要,尽量不要在结构体里塞引用类型属性;如果必须塞,最好让这个引用类型是不可变的,从根源上消除”看似复制、实则共享”的陷阱。
参考来源
《Swift编程权威指南》第18章《值类型与引用类型》