设置默认Main Actor隔离后类型仍被视为非隔离的Swift问题
问题解答
- Swift的模块级默认Actor隔离(如通过
@MainActor(module)配置)不会自动作用于公开协议。这是因为公开协议需要支持跨模块被采纳,若强制继承模块的默认隔离,可能与其他模块的隔离规则冲突,破坏兼容性。 - 你定义的
PluginTheme是公开协议,即便所在LibApp模块设置了默认Main Actor隔离,它仍会被判定为非隔离类型。而LibGame模块默认是Main Actor隔离,其中GamePluginTheme继承自这个非隔离协议,BasicGamePluginTheme又采纳了GamePluginTheme,就出现了“一致性跨越隔离域”的警告——Swift会认为这种跨隔离的协议采纳存在数据竞争风险,在Swift 6中会直接升级为错误。 - 当给
PluginTheme显式添加@MainActor后,协议本身被标记为Main Actor隔离,所有继承它的协议和采纳它的类型都会自动遵循该隔离规则,警告也就消失了。
内容的提问来源于stack exchange,提问作者HL666
相关产品推荐
相关产品推荐

