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.
Actor
protocol on that class? Because if I also need a non-actor class (for my legacy code) on the same codebase, I'll receive an error like:Type 'Zeppity' does not conform to protocol 'Actor'
. – Kendre