/* Page prose (zh-Hans) */
"WrappingUp" = "# 小结\n\n本章是同一个承诺的两半：像 `@MainActor` 这样的全局 actor 把代码钉在单一的串行化域上，而 `Sendable` 标记哪些值可以在域之间跨越。它们合在一起，让 Swift 6 编译器在你运行之前就把 data race 变成编译错误。下面这些要点，关键在于抵制两个悄悄把那份保护关掉的相反的捷径。\n\n* **`@MainActor`** 保证代码在主线程上运行，并且由编译器检查：`DispatchQueue.main.async` 的现代替代品。从另一个域调用它（或任何 actor 隔离的代码）需要 **`await`**。要有意地到达 main actor，用 **`MainActor.run { }`** 跳转一个闭包，或者用 **`Task { @MainActor in }`** 让整个任务在那里运行；一旦你在 main actor 上，那些 `await` 跳转就消失了。\n* 只隔离真正触碰共享 UI 状态的东西；把一切都披上 `@MainActor` 会把对后台友好的工作拖到主线程上，重新引入[为什么需要并发](Why%20Concurrency.playgroundchapter/Overview)一章里的卡顿。\n* **`@globalActor`** 让你为整个子系统定义你自己的单一串行化域标记；节制地使用它。\n* **`Sendable`** 标记可以安全跨越并发边界的类型。值类型和不可变的 final 类符合条件；**带有任何 `var` 的类不符合**，无论你用得多么小心：通过把它变成 actor、把它变成不可变的，或把它隔离来修复它。只对真正管理自己加锁的类型才动用 `@unchecked Sendable`，绝不要用它来让一个错误闭嘴。\n* **`@Sendable`** 闭包（比如 `Task` 接受的那个）只能捕获 Sendable 值，并且不能修改被捕获的 `var`。\n* Swift 6 用这一切把 data race 变成**编译期错误**：把那些错误当作编译器在证明你的并发是安全的。\n\n---\n\n## 接下来\n\n**[经典 vs 现代](Classic%20vs%20Modern.playgroundchapter/Overview)**：同一个问题用两种方式解决，这样你就能一次看到整段弧线，并决定何时迁移。\n\n[上一页](@previous)  |  第 11 / 11 页";
