如何在保持隔离的同时使 Swift actor 符合协议?

Gre*_*ley 15 concurrency actor swift swift5

假设我们有以下目标:

\n
    \n
  1. 我们想使用演员。
  2. \n
  3. 我们希望使用依赖注入并通过 DI 解析 actor。
  4. \n
  5. 我们希望将我们的参与者隐藏在协议后面,以便我们可以改变实现。
  6. \n
  7. 我们希望保持 Actor 的隔离,否则使用 Actor 就没有意义。
  8. \n
\n

所以具体的问题是:我们如何才能使 Swift actor 遵守协议,同时保持隔离?

\n
protocol Zippity {\n  func foo()\n}\n\nactor Zappity: Zippity {\n  func foo() {} // Doesn\'t compile\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我可以用 \xe2\x80\xa6 编译它

\n
actor Zappity: Zippity {\n  nonisolated func foo() {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 但这似乎违背了目的。我还尝试声明接口方法async,但也无法编译。

\n

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

\n

Gre*_*ley 32

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

protocol Zippity: Actor {
  func foo()
}

actor Zappity: Zippity {
  func foo() // This is a properly isolated method
}
Run Code Online (Sandbox Code Playgroud)

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