LESSON 08 / 577 分钟
struct、class 与值语义
建模时先理解“复制一个值”和“共享同一个对象”的差别。
用你的前端经验理解
JS 对象赋值通常共享引用。Swift struct 和 Array 表现为值语义;class 赋值共享实例。实现可能做写时复制优化。
01 / 理解问题
为什么需要它
值类型适合描述一份数据,例如文章标题、标签与已读状态;引用类型适合表达共享身份,例如全应用共用的会话服务。选择依据不是“哪种语法更先进”,而是复制后应独立还是继续指向同一个对象。Swift 的 struct 也有方法、初始化器和协议能力,不是只能存字段的简陋对象。
它是怎样工作的
把 struct 赋给另一个变量,在可观察语义上得到独立的值;修改副本不应改变原值。class 变量保存引用,复制引用后两者仍可能操作同一实例。ARC 管理引用计数,但强引用环可能让对象无法释放。还要注意:struct 如果包含 class 属性,复制外层并不会自动深拷贝内部对象。
02 / 掌握要点
把关键概念连起来
1
struct
很适合普通业务数据。复制后修改一份,不会在语义上改变另一份。实例方法要改变自身时常需要 mutating。
2
class
需要共享身份、引用语义或继承时使用。引用由 ARC 管理生命周期。
3
内存
class 的强引用环会造成内存无法释放,闭包捕获 self 时要判断是否需要 weak,而不是机械添加。
READ THE CODE
Swift · 示例片段
struct Draft { var title: String }let original = Draft(title: "Swift")var edited = originaledited.title = "SwiftUI"print(original.title) // Swift用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。
03 / 案例推演
编辑文章时选择草稿还是实时修改
- 用户打开编辑页时复制一个值类型 Article 作为草稿,修改草稿不会立刻污染列表。
- 点击保存时把草稿交回仓库;点击取消时直接丢弃。这个过程天然对应明确的提交边界。
- 若直接编辑共享 class 的属性,其他页面可能立即看到变化。“取消”便需要显式恢复,而不是简单关闭弹窗。
这里需要你亲自判断
“SwiftUI View 是 struct”不代表每次 body 求值都会重新创建所有屏幕控件;状态依赖视图身份保存。
04 / 动手验证
做一个小练习
分别用 struct 和 class 模拟复制一个资料对象,再修改副本昵称并比较结果。
- 分别用 struct 和 class 建立两个变量,修改第二个变量的标题,观察第一个。
- 检查一个包含引用类型成员的 struct,解释为什么外层是值类型仍可能共享内部状态。
展开参考思路与验收标准
值类型版本原始标题不变,引用类型版本两个变量看到相同的新标题。编辑草稿优先需要独立值,账号服务则往往需要稳定共享身份;两者都不是绝对规则。
05 / 检查理解
复制 struct 后修改副本,原值通常会怎样?
答对理解题后即可标记完成