es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo conformar un actor de Swift a un protocolo mientras se preserva el aislamiento?

Digamos que tenemos los siguientes objetivos:

  1. Queremos usar actores.
  2. Queremos usar inyección de dependencias y resolver actores a través de DI.
  3. Queremos ocultar nuestros actores detrás de protocolos para poder variar la implementación.
  4. 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.

Tags:  , , ,

Answer

  1. Avatar for 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.

    protocol Zippity {
      nonisolated func foo() async
    }
    
    actor Zappity: Zippity {
      func foo() async {
        // implementación aquí
      }
    }
    

    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.

Comments are closed.