Con el lanzamiento de Swift 5.5, se integró en el lenguaje el concepto del modelo de propiedad y las semánticas de movimiento, que fortalecen el control sobre la propiedad de los datos y permiten al compilador optimizar los traslados, reduciendo la cantidad de copias, lo cual es relevante para escenarios de alto rendimiento.
Las semánticas de movimiento implican que al pasar un valor (por ejemplo, un struct) se puede "transferir" la propiedad de ese valor sin copia. En este caso, el compilador puede invalidar la variable original (similar a move en C++). Ahora, el modelo de propiedad y las semánticas de movimiento se implementan principalmente como una prueba (aislamiento de actores, tipos enviables, @_move, consumiendo/auto-consumiendo) y prometen aparecer en la API pública.
La principal diferencia con ARC es que las semánticas de movimiento se aplican a los tipos de valor, mientras que ARC gestiona el tiempo de vida de los objetos de referencia.
Ejemplo (semántica de propiedad, Swift 5.5+):
func consume<T>(_ x: __owned T) { /* ... */ } struct LargeArray { var storage: [Int] mutating func clear() { storage.removeAll() } consuming func consumeSelf() { // self no está disponible después de la llamada } }
La gestión de la propiedad permite evitar copias inesperadas al trabajar con grandes estructuras.
Matices:
¿Cuál es la diferencia entre pasar un objeto struct a una función por valor, por referencia y por semánticas de movimiento en Swift?
Respuesta:
Ejemplo:
func foo(_ x: MyStruct) { /* copia */ } func bar(_ x: inout MyStruct) { /* por referencia */ } func baz(_ x: __owned MyStruct) { /* semánticas de movimiento, no copia */ }
Historia
En el proyecto, al pasar grandes estructuras a través de funciones, siempre ocurría una copia implícita, aumentando el gasto de memoria. Tras la implementación de las semánticas de movimiento experimentales y una gestión de propiedad más cuidadosa, se pudo redistribuir la carga de manera limpia y acelerar las secciones críticas.
Historia
Muchos desarrolladores usaron incorrectamente inout, creyendo que implementaba el movimiento, mientras que el valor seguía siendo accesible, lo que generaba propiedad ambigua de la variable, causando errores y violaciones de la lógica.
Historia
Error en la gestión de datos entre hilos: falta del calificativo Sendable en las estructuras, lo que llevó a copias inesperadas o errores de propiedad al trabajar de forma asíncrona con grandes estructuras a través de actores o tareas.