struct 是值类型:它在赋值时被复制,每份副本都相互独立。class 是引用类型:赋值会共享同一个实例,两个变量指向同一个对象。这一个区别驱动了 Swift 中大多数的设计决策。
工作原理
swift
{ x: }
{ x: ; (: ) { .x x } }
a (x: )
b a
b.x
(a.x, b.x)
c (x: )
d c
d.x
(c.x, d.x)
| 方面 | struct(值) | class(引用) |
|---|---|---|
| 复制语义 | 独立副本 | 共享引用 |
| 变更 | 需要 var / mutating | 通过任意引用即可变更 |
| 标识 | 无(按值比较) | === 标识 |
| 继承 | 无 | 有 |
| 内存 | 通常在栈上,无 ARC | 在堆上,由 ARC 管理 |
struct 在方法中修改存储属性时还需要 mutating,因为方法默认得到的是一个不可变的 self。
struct——Swift 标准库(Array、String、Int)以及 SwiftUI 的 View 都是值类型。它们可以安全地跨线程共享,且不会有循环引用。NSObject)时,使用 class。选择值类型还是引用类型决定了某处的改动是否会泄漏到另一处。「编辑一个 item 却把它们全改了」这类 bug 就来自意料之外的引用共享;SwiftUI 的整个模型都假定视图是廉价、可复制的值类型——所以面试官会考察你是否会优先使用 struct。