La palabra clave inout en Swift permite que una función modifique el valor del parámetro pasado directamente (por referencia), en lugar de trabajar con una copia. Esto es análogo al paso por referencia en algunos otros lenguajes.
Ejemplo:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // Ahora x == 11
var), no se puede pasar let.Pregunta: ¿Se puede pasar una propiedad de una estructura a una función con un parámetro inout si la estructura se usa como parte de otro objeto?
Respuesta: No, porque Swift prohíbe el acceso simultáneo a la misma propiedad en una sola instrucción (Exclusive Access to Memory) para evitar condiciones de carrera y comportamientos indeterminados. Ejemplo:
struct Point { var x: Int var y: Int } var p = Point(x: 1, y: 2) increment(&p.x) // ok increment(&p.y) // ok // increment(&p.x, &p.x) // provocará un error
Historia
En un proyecto, un desarrollador intentó pasar la misma variable a dos parámetros de función con el modificador inout, lo que llevó a un error de compilación. Esto obligó a reconsiderar la arquitectura de la función, dividiendo los cambios en dos pasos.
Historia
Un implementador modificaba un arreglo a través de un parámetro inout dentro de un bucle, lo que causaba resultados inesperados, ya que Swift copia el contenido al pasar, y los cambios no estaban sincronizados entre los bucles.
Historia
Un desarrollador esperaba que los parámetros inout siempre funcionaran "por referencia", pero se topó con la semántica copy-in/copy-out al trabajar con clases y estructuras, por lo que no todos los cambios se guardaban si se modificaban objetos anidados de estructuras.