如何在保持隔离的同时使 Swift 参与者遵守协议?

How can I conform a Swift actor to a protocol while preserving isolation?

假设我们有以下目标:

  1. 我们想用演员。
  2. 我们想使用依赖注入,通过 DI 解析 actors。
  3. 我们希望将我们的参与者隐藏在协议之后,以便我们可以改变实现。
  4. 我们希望保持 a​​ctor 隔离,否则使用 actor 毫无意义。

所以具体问题是:我们如何在保持隔离的同时使 Swift 参与者遵守协议?

protocol Zippity {
  func foo()
}

actor Zappity: Zippity {
  func foo() {} // Doesn't compile
}

我可以用...编译它

actor Zappity: Zippity {
  nonisolated func foo() {}
}

…但这似乎违背了目的。我也尝试声明接口方法 async 但也没有编译。

我可以想到几种合理的解决方法,包括组合、nonisolated async 调用孤立方法的方法等,但想看看是否有我遗漏的东西。

好的,我找到了答案,而且非常简单:

protocol Zippity: Actor {
  func foo()
}

actor Zappity: Zippity {
  func foo() // This is a properly isolated method
}

似乎声明符合 Actor 协议可以启用编译器魔法。