建议先保留现有语言模式,本周挑一个自有 target 启用完整并发检查;诊断和发布构建都验证通过后,再逐模块切到 Swift 6 模式。这个做法适合维护现有 iOS App、尚未盘点依赖和并发警告的独立开发者与小团队。

维护 Swift 5 模式项目的开发者,可以据此评估迁移范围。
拥有多个 Swift target 或第三方依赖的团队,可以据此安排分批验证。
负责发布构建的人,可以据此核对本地和远程构建是否采用相同设置。

最后更新于 2026 年 10 月 30 日;版本与迁移规则核对了 Apple Xcode 系统要求和 Swift 官方迁移指南。项目是否适合迁移,仍须以自己的构建日志、测试结果和归档结果为准。

01

编译器版本与语言模式:升级工具链不等于切换规则

Swift 6.4 是编译器版本;Swift 6 语言模式是针对 target 选择的语言检查模式。用 Swift 6.4 编译器构建,不代表项目已经启用 Swift 6 模式。Swift 官方说明,语言模式可以按 target 选择,既有 target 不会因为更换编译器就自动进入新模式。(Swift 迁移指南)

因此,先确认项目“实际在用什么”,不要先把整个工作区的 Swift 版本统一改成 6。检查 Xcode 中每个 Swift target 的 Swift Language Version,再核对 .xcconfig、包清单和构建脚本有没有覆盖设置。Apple 的构建设置参考也说明,严格并发检查由 SWIFT_STRICT_CONCURRENCY 控制;Swift 6 模式下该检查完整启用,并发相关诊断会按错误处理。(Apple 构建设置参考)

使用 Swift 6.4 编译器时,现有 Swift 5 模式项目还能继续构建吗?
可以。前提是当前 Xcode 支持项目所需的 SDK、依赖和构建设置。要确认的不是项目文件里有没有一个“6”,而是构建日志显示的编译器版本,以及每个 target 最终采用的语言模式。

两种状态的差异不只是界面选项。旧模式配合完整严格并发检查,可以先把数据隔离问题作为警告暴露出来;切到 Swift 6 模式后,相应检查成为强制规则,未解决的问题可能阻断构建。项目如果另行启用了“将警告视为错误”,旧模式里的警告也可能导致构建失败,不能仅凭语言模式推断结果。(严格并发检查配置说明)

02

并发诊断对照:先看警告,再判断哪些会阻断构建

迁移前后都要保留可比较的构建日志。把同一份代码、同一套依赖分别在现有设置和试验设置下构建,记录新增诊断所属的 target、文件、行号与类型。重点看共享可变状态、跨 actor 传值、非 Sendable 类型和第三方 API 的并发注解。

选择 检查结果与构建影响 适用判断
保留现有检查级别 不额外暴露完整并发检查诊断;不能据此判断并发问题已经解决 近期发布、尚未建立诊断基线时,可先保留
旧语言模式+完整检查 将更多并发安全问题作为警告呈现;可先修复或分类,再评估切换 适合先摸清影响范围、保持现有发布分支可构建
Swift 6 语言模式 并发安全检查成为强制规则;未解决的相关问题可能升级为错误 诊断可控、依赖已验证且发布链路能通过时,再逐 target 启用

这张表用于判断迁移顺序,不是“警告数量少就安全”的保证。Swift 官方建议先选择模块、在 Swift 5 模式下加强检查,再处理警告;迁移通常需要反复针对模块和依赖调整。(Swift 迁移策略)

什么情况下适合把现有 target 切到 Swift 6 语言模式?
当试验 target 的完整并发检查结果已分类,关键诊断有明确处理方案,相关依赖能够参与目标构建,并且 Debug、Release、归档和主要测试都通过时,再考虑扩大切换范围。若当前正处于紧邻发布的冻结期,或迁移会触碰多个未维护依赖,先继续以旧模式收集诊断通常更稳妥。

03

第一步:盘点 target 与依赖,别把“能解析”当成“能迁移”

把应用、扩展、测试 target、自有 framework 和 Swift Package 分开列出。逐项记下语言模式、并发检查设置、依赖来源以及是否能修改依赖。先选一个边界清晰的自有模块试验;它的改动若失败,影响范围应能控制,而不是连带修改整套发布流程。

依赖需要核查实际参与构建的代码路径。SwiftPM 成功解析版本,只能说明包管理器找到了满足版本约束的依赖,不等于源码在目标工具链、语言模式和目标平台下编译通过。SwiftPM 的依赖说明将版本要求与依赖产品加入 target 分别处理;因此还要检查具体 target 的编译结果。(SwiftPM 添加依赖说明)

第三方依赖兼容性要怎样核验?
先锁定依赖版本和解析结果,再用计划采用的 Xcode 与语言模式构建实际引用这些包的 target。检查依赖公开 API 是否有并发注解、是否暴露非 Sendable 类型,以及是否通过 @preconcurrency 等方式暂缓诊断。暂缓检查不等于依赖已经完成迁移;要把这类例外单独登记,避免把“可互操作”误当成“已验证并发安全”。(Swift 并发常见编译问题)

对自有模块,可以按依赖关系从外围、较少被其他模块依赖的 target 开始,记录每次切换带来的诊断变化。遇到警告时,先表达代码当前真实的隔离关系;不要为了消除提示就随手添加 @unchecked Sendable 或 nonisolated(unsafe)。这些标记涉及对线程安全的承诺,应先确认锁、队列或 actor 隔离确实覆盖所有访问。

04

第二步:按模块处理诊断,测试通过不等于并发缺陷归零

把完整检查报告与测试结果分开记录。编译器诊断说明静态检查发现了什么;测试说明选定场景下行为是否符合预期。两者用途不同,检查没有报错不等于证明产品不存在数据竞争,测试通过也不能替代编译器对隔离边界的检查。

测试应覆盖应用真正依赖的并发路径:后台任务与 UI 状态交接、共享缓存读写、取消与重试、并发请求合并,以及任务完成后的状态更新。针对每个修改过的模块,跑相关单元测试和集成测试;若诊断修复调整了 actor 隔离、任务创建或数据传递方式,还要核对调用顺序和取消行为有没有变化。

并发诊断能否按模块分批解决?
可以。Swift 官方迁移指南说明,Swift 6 语言模式可按 target 采用,旧模式与新模式的模块能够在同一项目中互操作。先迁移边界清晰的自有模块,再处理它的依赖;保留未迁移 target 的语言模式,并用构建日志确认每个 target 的实际设置。(Swift 官方迁移指南)

05

第三步:对齐 Debug、Release 与归档结果,再扩大范围

发布风险常藏在配置差异里:Debug 与 Release 可能继承不同设置;Scheme 的 Archive 动作也可能选择不同的构建配置或 target。Apple 文档指出,Scheme 会决定构建、测试和归档时采用的 target 与配置;发布构建应按实际归档配置单独检查。(Xcode Scheme 配置说明)

按下面的顺序留存证据:

  • ✅ 列出目标清单:记录 App、扩展、framework、测试 target 及其依赖。
  • ✅ 保存迁移前基线:记录 Xcode 与 Swift 编译器版本、语言模式、严格并发检查设置和警告处理策略。
  • ✅ 选一个试验 target:只修改该 target 的设置,构建并保存完整日志,按问题类型归类诊断。
  • ✅ 验证依赖和行为:在目标模式下编译实际依赖的模块,运行覆盖主要并发路径的测试,并登记暂缓检查的例外。
  • ✅ 复核配置矩阵:分别确认 Debug、Release 和 Archive 使用预期语言模式与检查设置。
  • ✅ 验证归档产物:执行项目实际采用的归档流程,检查归档结果和发布所需验证;通过后再迁移下一个 target。

可以用 xcodebuild -showBuildSettings 核对命令行构建得到的有效设置,再对目标 Scheme 分别运行构建、测试和归档命令。不要只保存 Xcode 设置界面的截图:它不能证明 CI 或另一台 Mac 使用了相同 Scheme、配置和命令行覆盖项。Apple 将 Release 构建与归档作为独立验收环节,也提醒开发者留意不同配置之间的设置差异。(测试 Release 构建)

如果本地和远程构建结果不一致,优先对照编译器版本、实际 target 设置、Scheme、依赖解析结果和归档命令。远程环境适合复现构建与归档,但不能代替项目自己的依赖兼容验证、并发行为测试,也不能凭一份成功归档日志证明运行时没有竞态。

若项目目前只在本地低频发布,而且依赖、签名与归档链路都稳定,先在现有 Mac 上完成分阶段验证即可。若需要在另一台 Mac 上复现编译和归档结果,远程 Mac 可以作为临时复核环境;与只用本地机器相比,它能提供独立的构建环境和持续可访问性,但仍需要核对工具链与项目设置。可以先阅读 MESHLAUNCH 的远程 Mac 服务说明,再根据项目是否需要独立验收环境,比较 Mac mini M4 租赁方案。长期固定负载或必须接入本地实体设备的项目,先评估自有硬件是否更合适。