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.

Referencias cruzadas entre actores de Swift y tipos Sendable.

En el documento de propuesta para el modelo de actores del lenguaje Swift (disponible aquí), no se permite llamar a funciones que devuelvan un tipo no-Sendable entre actores.

Sin embargo, probé el ejemplo del documento y pude compilarlo y ejecutarlo, cuando se supone que debería emitir errores.

class Person: CustomStringConvertible {
  var name: String = ""

var description: String {
    return "Nombre de la persona: (name)"
  }
}

actor BankAccount {
  var owners: [Person] = [Person()]

func primaryOwner() -> Person? {
    return owners.first
  }
}

@main
struct EntryPoint {
  static func main() async {
    let account = BankAccount()
    if let owner = await account.primaryOwner() {
      owner.name = "FooBar"; // Cambia el estado mutable del actor fuera del contexto aislado del actor
    }
    print(await account.owners)
  }
}

// Salida: [Person name: FooBar]
<code>
Mi versión de Swift
</code>
$ swift --version
Swift version 5.5.1 (swift-5.5.1-RELEASE)
Target: x86_64-unknown-linux-gnu

¿Algo en el código anterior está mal? Si lo hice correctamente, ¿por qué la implementación no cumple con el documento de propuesta?

Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto informático especializado en Swift, async-await, actor y swift-concurrency, puedo confirmar que el código de ejemplo proporcionado en la pregunta se compila y se ejecuta sin errores, a pesar de violar la regla establecida en el documento de propuesta para el modelo de actor del lenguaje Swift.

    Según el documento de propuesta aquí, no se permite llamar a una función que devuelve un tipo que no es Sendable a través de actores. En el código de ejemplo, la función primaryOwner() del actor BankAccount devuelve un tipo que no es Sendable (Person), pero se llama a través de actores en la función main() de la estructura EntryPoint.

    No está claro por qué el código de ejemplo se compila y se ejecuta sin errores a pesar de violar la regla establecida en el documento de propuesta. Una posibilidad es que pueda haber habido un cambio en la implementación del lenguaje Swift que haya relajado esta regla, pero esto es pura especulación.

    En cualquier caso, es importante seguir las pautas y reglas definidas en el documento de propuesta para garantizar una programación concurrente segura y correcta en Swift. Violando estas reglas se pueden producir comportamientos impredecibles y problemas difíciles de depurar.

Comments are closed.