/* Page prose (zh-Hans) */
"MigrationStrategy" = "# 一套务实的迁移策略\n\n你不会在一个周末里重写一个 app，你也不该这么做。沿着一条每一步都安全的路径来迁移：\n\n**1. 在边界处包裹遗留回调。**  \n最有杠杆效应的一步。拿一个带 completion handler 的 API，用一个 **continuation** 给它一副 `async` 的面孔。现在这个包装*之上*的一切都可以是现代的，而底下那个旧实现则原封不动地继续工作：";
"MigrationStrategy-2" = "**2. 用 `async`/`await` 写所有*新*代码。**  \n别再添加 completion handler 了。新功能从现代方式开始，并在需要的地方调用被包裹的遗留层。\n\n**3. 用 actor 替换临时性的加锁。**  \n每当你发现一个串行队列、一个 `NSLock`，或一个计数为 1 的信号量在守护某些共享状态，那就是一个变成 **actor** 的绝佳候选。隔离从“每个调用者都必须记住规则”转移到了“编译器强制执行它”。\n\n**4. 为 UI 采用 `@MainActor`。**  \n给你的 view model 和触及 UI 的类型标注上 **`@MainActor`**。这删除了一整类“我忘了跳回主线程”的 bug，因为编译器现在替你追踪属于主线程这件事。\n\n**5. 逐步迈向 Swift 6 的 data race 安全。**  \n打开更严格的并发检查，一次一个模块地修复警告。每一条警告都是编译器在指出一个过去看不见的真实（或潜在的）data race。把它当作一份待办清单，而不是一场紧急事件。语言模式让你可以逐渐推进，而不是一次全做。\n\n---\n\n贯穿始终的一条线：**在接缝处现代化。** 包裹边界，在它现代的那一侧构建新工作，让旧的那一侧随时间缩小，而不是要求一次性的大爆炸式重写。\n\n[上一页](@previous)  |  第 6 / 8 页  |  [下一页: 哪个工具用在何时](@next)";
