Swift6中Actor调用MainActor协议方法触发数据竞争风险编译错误
问题分析与解决方案
编译错误原因
FeatureARootPresenter被标记为@MainActor,意味着该协议的所有实例都归属主Actor隔离上下文。但FeatureARootInteractor是自定义Actor,当在其中持有并调用presenter的方法时,编译器无法静态确认any FeatureARootPresenter类型的隔离访问安全性,因此触发错误:
发送类型为'any FeatureARootPresenter'的'self'-隔离值,后续访问主Actor隔离上下文可能导致数据竞争
解决方法
方法一:标记presenter属性为@MainActor
明确指定presenter属性归属主Actor,让编译器确认其隔离上下文:
@MainActor protocol FeatureARootPresenter { func presentFeatureASecondScreen() async } actor FeatureARootInteractor { @MainActor private var presenter: FeatureARootPresenter init(presenter: FeatureARootPresenter) { self.presenter = presenter } func showSecondScreen() async { await MainActor.run { await self.presenter.presentFeatureASecondScreen() } } }
方法二:调用时切换到主Actor并捕获presenter值
在调用方法时,通过MainActor.run切换到主Actor上下文,并捕获presenter值避免访问self的隔离属性:
@MainActor protocol FeatureARootPresenter { func presentFeatureASecondScreen() async } actor FeatureARootInteractor { private let presenter: FeatureARootPresenter init(presenter: FeatureARootPresenter) { self.presenter = presenter } func showSecondScreen() async { await MainActor.run { [presenter] in await presenter.presentFeatureASecondScreen() } } }
补充说明
如果不需要协议抽象,直接使用具体类型替代any FeatureARootPresenter,编译器也能自动推断隔离上下文,避免错误。
内容的提问来源于stack exchange,提问作者poGUIst
相关产品推荐
相关产品推荐

