Swift 面试:值语义、COW 与集合源码解析

Swift 面试:值语义、COW 与集合源码解析 Swift 的 Array、String、Dictionary 都表现为值类型,但它们不可能每次赋值都完整复制底层存储。面试官问值语义和 COW,真正想看的是你能不能说清楚:值语义是语言语义,COW 是性能实现;集合表面是 struct,底层经常共享引用存储;写入前靠唯一性检查决定是否复制。 这篇文章从面试题出发,把结论落到 Swift 标准库源码里的 Array buffer、String guts、Dictionary storage 和 isKnownUniquelyReferenced。 面试高频问题 Swift 的 struct 为什么常说是值语义? Array 赋值时一定会复制底层元素吗? Copy-on-Write 的触发条件是什么? isKnownUniquelyReferenced 检查的到底是什么? Array、ContiguousArray、ArrayBuffer、Storage 是什么关系? String 为什么不能用整数下标随机访问? String.Index 为什么不是一个简单的 Int? Dictionary 也是 COW 吗? ArraySlice 为什么可能持有原数组存储? 值类型里包含 class 引用,还算值语义吗? 30 秒回答版 Swift 的值语义是说:从语言使用者角度看,赋值、传参、修改不会意外影响另一个值。但这不等于底层每次都立即复制。 标准库集合通常用 Copy-on-Write 实现:多个值可以共享同一份堆上 buffer;只有当某个值要写入时,才检查底层 buffer 是否唯一引用。如果唯一,就原地修改;如果不唯一,就复制一份新 buffer 再修改。 所以: 值语义:用户看到的是独立值 COW:实现上先共享,写入前再判断是否复制 ARC:维护底层 buffer 的引用计数 isUnique:让 COW 判断能否原地修改 面试可以这样回答: Swift 的 Array 是 struct,但它内部持有引用语义的 storage。赋值时通常只复制结构体里的引用;真正写入时通过唯一性检查决定是否复制底层 storage。这让 Array 同时具备值语义和接近引用共享的性能。 ...

June 16, 2026