Let's say we have the following goals:
- We want to use actors.
- We want to use dependency injection and resolve actors through DI.
- We want to hide our actors behind protocols so we can vary the implementation.
- We want to preserve actor isolation, otherwise there's no point in using actors.
So the specific question is: How can we conform a Swift actor to a protocol while preserving isolation?
protocol Zippity {
func foo()
}
actor Zappity: Zippity {
func foo() {} // Doesn't compile
}
I can make it compile with …
actor Zappity: Zippity {
nonisolated func foo() {}
}
… but that seems to defeat the purpose. I also tried declaring the interface method async
but that also didn't compile.
I can think of several reasonable workarounds, including composition, nonisolated async
methods that call isolated methods, etc. but wanted to see if there's something I'm missing.