迁移 App 到 Swift 6 值得注意的坑

Apr 12, 2025 • 预计阅读时间 1 分钟

Xcode 16.3 正式版本发布了,Swift 6 也更新到了 6.1 版本,终于完全把项目迁移到 Swift 6 了。

Swift 6 的迁移过程网络上的文章已经很多了,和我遇到的问题基本上大同小异,参考一下就可以顺利解决。

顺利编译运行起来后,在某些情况下会发生崩溃:

Thread 6 Queue: com... (concurrent)
O _dispatch_assert_queue_fail
1 dispatch_assert_queue$V2.cold.1
2 dispatch_assert_queue
3 swift_task_isCurrentExecutorWith...
4 closure #1 in CreateCommentView...
5 ReactiveSwift.Operators.Filter.rece...
6 ReactiveSwift.Observer.process(R...
7 ReactiveSwift.Signal.Observer.sen...
8 generic partial specialization < Sign...
9 ReactiveSwift.Signal.Observer.sen...
10 merged closure #1 (Swift.Optional...
11 partial apply forwarder for closure...
12 closure #3 (Swift.Optional<Swift....
13 function signature specialization...
14 @objc ReactiveCocoa. KeyValueO...
15 NSKeyValueNotifyObserver
16 NSKeyValueDidChange
17 - [NSObject(NSKeyValueObservin...
18 - [NSObject(NSKeyValueObservin...
19 _NSSetObjectValueAndNotify
20 closure #1 in closure #1 in Cre...

查看代码逻辑发现都是和 GCD 相关,在 GCD 的 block 里混合使用了 Task {...} 或者是 actor 相关的方法,触发了 GCD 的 actor 的隔离断言。

这类情况在编译期间无法察觉(没有编译警告),如果在生产环境肯定会影响用户体验,解决方法是在 Release 的配置里添加 -disable-dynamic-actor-isolation 编译选项:

OTHER_SWIFT_FLAGS = -disable-dynamic-actor-isolation

https://github.com/swiftlang/swift-evolution/blob/main/proposals/0423-dynamic-actor-isolation.md#disabling-dynamic-actor-isolation-checking

参考

Swift
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

在 macOS 设置的 “安全性” 开启 “运行任意来源”

Mac 上内置的网络测速工具 networkQuality