Swift 6中协议与Actor的隔离问题及解决方案咨询
解决Swift 6中自定义Actor访问协议属性的隔离警告
你的推测是对的——Swift 6中协议成员默认会被推断为MainActor隔离,导致自定义DerivativeSymbolActor无法直接访问这些属性,触发隔离域不匹配的警告。要让协议与自定义Actor绑定隔离,有两种直接的解决方式:
方式一:给协议成员添加isolated关键字
在协议的每个属性前加上isolated关键字,强制要求这些属性的访问和修改必须在实现它们的Actor隔离域中进行。这样当DerivativeSymbolActor中的Symbol类型实现协议时,属性会自动归属到该Actor的隔离域:
protocol DerivativeSymbol { associatedtype Ticker: DerivativeTicker isolated var baseCoin: String { get } isolated var quoteCoin: String { get } isolated var ticker: Ticker? { get set } } protocol DerivativeTicker { isolated var ask1Price: Double { get set } isolated var bid1Price: Double { get set } isolated var ask1Size: Double { get set } isolated var bid1Size: Double { get set } isolated var lastPrice: Double { get set } isolated var indexPrice: Double { get set } }
方式二:用@ActorIsolated修饰协议
直接给整个协议添加@ActorIsolated属性,指定协议的所有成员都归属到DerivativeSymbolActor的隔离域:
@ActorIsolated(DerivativeSymbolActor.self) protocol DerivativeSymbol { associatedtype Ticker: DerivativeTicker var baseCoin: String { get } var quoteCoin: String { get } var ticker: Ticker? { get set } } @ActorIsolated(DerivativeSymbolActor.self) protocol DerivativeTicker { var ask1Price: Double { get set } var bid1Price: Double { get set } var ask1Size: Double { get set } var bid1Size: Double { get set } var lastPrice: Double { get set } var indexPrice: Double { get set } }
为什么这样能解决问题?
Swift 6的Actor隔离规则中,未明确指定隔离域的协议成员会默认继承上下文的隔离域(这里被推断为MainActor)。通过上述两种方式,我们显式将协议成员的隔离域绑定到DerivativeSymbolActor,让自定义Actor可以安全地访问和修改这些属性,消除隔离不匹配的警告。
内容的提问来源于stack exchange,提问作者isaharray
相关产品推荐
相关产品推荐

