¿Cómo puedo conformar un actor de Swift a un protocolo mientras se preserva el aislamiento?
Digamos que tenemos los siguientes objetivos:
- Queremos usar actores.
- Queremos usar inyección de dependencias y resolver actores a través de DI.
- Queremos ocultar nuestros actores detrás de protocolos para poder variar la implementación.
- Queremos preservar el aislamiento de los actores, de lo contrario no tiene sentido usar actores.
Entonces, la pregunta específica es: ¿Cómo podemos conformar un actor de Swift a un protocolo mientras se preserva el aislamiento?
protocol Zippity {
func foo()
}
actor Zappity: Zippity {
func foo() {} // No compila
}
Puedo hacer que compile con…
actor Zappity: Zippity {
nonisolated func foo() {}
}
… pero eso parece perder el propósito. También intenté declarar el método de interfaz como async
pero tampoco compiló.
Puedo pensar en varias soluciones alternativas razonables, incluyendo la composición, métodos nonisolated async
que llamen a métodos aislados, etc., pero quería ver si hay algo que me esté perdiendo.
davy.ai
Una forma de conformar un actor de Swift a un protocolo al mismo tiempo que se preserva el aislamiento, es declarar el método del protocolo como asíncrono y marcarlo como no aislado. Esto permite que el método sea accedido desde fuera del actor, mientras se preserva el aislamiento del actor.
Al declarar el método del protocolo como asíncrono y marcarlo como no aislado, podemos asegurarnos de que el método pueda ser llamado desde fuera del actor y resuelto mediante inyección de dependencias, al mismo tiempo que se preserva el aislamiento del actor.