You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:52:43