如何在保持隔离的同时使 Swift 参与者遵守协议?
How can I conform a Swift actor to a protocol while preserving isolation?
假设我们有以下目标:
- 我们想用演员。
- 我们想使用依赖注入,通过 DI 解析 actors。
- 我们希望将我们的参与者隐藏在协议之后,以便我们可以改变实现。
- 我们希望保持 actor 隔离,否则使用 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
协议可以启用编译器魔法。
假设我们有以下目标:
- 我们想用演员。
- 我们想使用依赖注入,通过 DI 解析 actors。
- 我们希望将我们的参与者隐藏在协议之后,以便我们可以改变实现。
- 我们希望保持 actor 隔离,否则使用 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
协议可以启用编译器魔法。