迁移到严格并发
逐步采用 Swift 6 的并发检查。
迁移到严格并发 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
什么是严格并发
严格并发检查会让编译器在编译时诊断每个潜在的数据竞争。
在 Swift 6 语言模式中,它默认开启;在 Swift 5 模式中,您可以逐步选择启用。
三个检查级别
-strict-concurrency 标志有三个级别:minimal(Swift 5 中的默认值)、targeted(检查已经使用并发的代码)以及 complete(完整的 Swift 6 风格检查)。
// Build settings example
// SWIFT_STRICT_CONCURRENCY = complete逐步采用
推荐的路径是逐步提升级别:从 targeted 开始,修复警告,然后切换到 complete,最后再将语言模式切换到 6。
这样可以让大型代码库的迁移保持在可控范围内。
// Step 1: targeted
// Step 2: complete (warnings)
// Step 3: Swift 6 mode (errors)按模块迁移
严格并发是按目标设置的。您可以一次迁移一个模块,在其他模块准备好之前让它们继续使用 Swift 5 模式。
// Package.swift target
// swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]常见警告:捕获非 Sendable 值
最常见的诊断是:在 Task 中捕获非 Sendable 值,或将其跨越参与者边界传递。
您可以让该类型实现 Sendable,或者只复制出 Sendable 数据来修复此问题。
final class Model { var name = "" }
func start(_ m: Model) {
// Warning: non-Sendable Model captured by Task
// Task { print(m.name) }
}使用值类型修复
通常,最简洁的修复方式是将数据建模为不可变值类型,这样它会自动成为 Sendable。
struct Model: Sendable { let name: String }
func start(_ m: Model) {
Task { print(m.name) } // safe now
}使用 @MainActor 修复
界面类型经常产生警告,因为它们会从后台任务中被访问。为类型添加 @MainActor 注解,可以将其固定到主线程并解决这些警告。
@MainActor
final class ViewModel {
var items: [String] = []
func reload() async {
let fetched = await load()
items = fetched
}
}
func load() async -> [String] { [] }为现有类型实现 Sendable 一致性
对于您能够控制且已经线程安全的类型,请显式添加 Sendable 或 @unchecked Sendable 一致性,以诚实地消除警告。
import Foundation
final class Counter: @unchecked Sendable {
private let lock = NSLock()
private var n = 0
}并发前导入
当某个依赖项尚未为其接口添加注解时,@preconcurrency import 会放宽对该模块的检查,在它更新之前将错误降级为警告。
@preconcurrency import SomeLegacyFramework将符号标记为 @preconcurrency
您也可以将单独的声明标记为 @preconcurrency,这样在添加 Sendable 要求时,来自旧代码的调用方不会收到错误。
@preconcurrency
func handle(_ value: Sendable) { }验证迁移结果
当 complete 检查产生零条警告后,将目标切换到 Swift 6 模式,使这些保证成为强制执行的错误并防止问题回退。
// Package.swift
// .target(name: "App", swiftSettings: [.swiftLanguageMode(.v6)])快速检查:迁移
请测试您对严格并发迁移的理解。
回顾:迁移到严格并发
严格并发检查将数据竞争检测移至编译时,并提供 minimal、targeted 和 complete 三个级别。请按模块进行迁移,使用值类型、@MainActor 或诚实的 Sendable 一致性来修复非 Sendable 捕获,并使用 @preconcurrency 缓解与尚未迁移的依赖项之间的互操作问题。
当 complete 检查不再产生警告后,启用 Swift 6 模式以锁定这些保证。
常见问题解答
「迁移到严格并发」课时是免费的吗?
是的 — 「迁移到严格并发」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「迁移到严格并发」这节课中我会学到什么?
逐步采用 Swift 6 的并发检查。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「迁移到严格并发」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。