LESSON 08 / 577 分钟

struct、class 与值语义

建模时先理解“复制一个值”和“共享同一个对象”的差别。

用你的前端经验理解

JS 对象赋值通常共享引用。Swift struct 和 Array 表现为值语义;class 赋值共享实例。实现可能做写时复制优化。

为什么需要它

值类型适合描述一份数据,例如文章标题、标签与已读状态;引用类型适合表达共享身份,例如全应用共用的会话服务。选择依据不是“哪种语法更先进”,而是复制后应独立还是继续指向同一个对象。Swift 的 struct 也有方法、初始化器和协议能力,不是只能存字段的简陋对象。

它是怎样工作的

把 struct 赋给另一个变量,在可观察语义上得到独立的值;修改副本不应改变原值。class 变量保存引用,复制引用后两者仍可能操作同一实例。ARC 管理引用计数,但强引用环可能让对象无法释放。还要注意:struct 如果包含 class 属性,复制外层并不会自动深拷贝内部对象。

把关键概念连起来

1

struct

很适合普通业务数据。复制后修改一份,不会在语义上改变另一份。实例方法要改变自身时常需要 mutating。

2

class

需要共享身份、引用语义或继承时使用。引用由 ARC 管理生命周期。

3

内存

class 的强引用环会造成内存无法释放,闭包捕获 self 时要判断是否需要 weak,而不是机械添加。

Swift · 示例片段
struct Draft { var title: String }let original = Draft(title: "Swift")var edited = originaledited.title = "SwiftUI"print(original.title) // Swift

用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。

编辑文章时选择草稿还是实时修改

  1. 用户打开编辑页时复制一个值类型 Article 作为草稿,修改草稿不会立刻污染列表。
  2. 点击保存时把草稿交回仓库;点击取消时直接丢弃。这个过程天然对应明确的提交边界。
  3. 若直接编辑共享 class 的属性,其他页面可能立即看到变化。“取消”便需要显式恢复,而不是简单关闭弹窗。

这里需要你亲自判断

“SwiftUI View 是 struct”不代表每次 body 求值都会重新创建所有屏幕控件;状态依赖视图身份保存。

做一个小练习

分别用 struct 和 class 模拟复制一个资料对象,再修改副本昵称并比较结果。

  1. 分别用 struct 和 class 建立两个变量,修改第二个变量的标题,观察第一个。
  2. 检查一个包含引用类型成员的 struct,解释为什么外层是值类型仍可能共享内部状态。
展开参考思路与验收标准

值类型版本原始标题不变,引用类型版本两个变量看到相同的新标题。编辑草稿优先需要独立值,账号服务则往往需要稳定共享身份;两者都不是绝对规则。

复制 struct 后修改副本,原值通常会怎样?

继续查阅官方资料
Swift 官方文档

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成