Quiero pasar mi Swift Array
account.chats
a chatsViewController.chats
por referencia (para que cuando agregue un chat account.chats
, chatsViewController.chats
todavía apunte a account.chats
). Es decir, no quiero que Swift separe las dos matrices cuando la duración de los account.chats
cambios.
arrays
swift
pass-by-reference
ma11hew28
fuente
fuente
account
una variable global y definir lachats
propiedad deChatsViewController
que:var chats: [Chat] { return account.chats }
.Respuestas:
Las estructuras en Swift se pasan por valor, pero puede usar el
inout
modificador para modificar su matriz (vea las respuestas a continuación). Las clases se pasan por referencia.Array
yDictionary
en Swift se implementan como estructuras.fuente
NSArray
porque,NSArray
y la matriz Swift tiene diferencias semánticas sutiles (como el tipo de referencia), y eso posiblemente lo lleve a más errores.inout
con Structs?Para el operador de parámetro de función usamos:
let (es el operador predeterminado, por lo que podemos omitir let ) para hacer que un parámetro sea constante (significa que no podemos modificar ni siquiera la copia local);
var para hacerlo variable (podemos modificarlo localmente, pero no afectará la variable externa que se ha pasado a la función); e
inout para convertirlo en un parámetro in-out. In-out significa, de hecho, pasar variables por referencia, no por valor. Y requiere no solo aceptar el valor por referencia, sino también pasarlo por referencia, así que páselo con & - en
foo(&myVar)
lugar de solofoo(myVar)
Entonces hazlo así:
Para ser exactos, no es solo una referencia, sino un alias real para la variable externa, por lo que puede hacer un truco con cualquier tipo de variable, por ejemplo, con un entero (puede asignarle un nuevo valor), aunque puede no ser un es una buena práctica y puede ser confuso modificar los tipos de datos primitivos como este.
fuente
inout
posición ha cambiado, es decirfunc addItem(localArr: inout [Int])
var
ya no está disponible para el atributo de parámetro de función.Defínese una
BoxedArray<T>
que implemente laArray
interfaz pero delegue todas las funciones a una propiedad almacenada. Como talUse el
BoxedArray
lugar donde usaría unArray
. La asignación de unBoxedArray
será por referencia, es una clase y, por lo tanto, los cambios en la propiedad almacenada, a través de laArray
interfaz, serán visibles para todas las referencias.fuente
String
hay un subtipo deAny
PERO siimport Foundation
luego teString
conviertes en un subtipo deAnyObject
.Para las versiones Swift 3-4 (XCode 8-9), use
fuente
Algo como
???
fuente
func test(b: inout [Int])
... tal vez esta es una sintaxis antigua; Solo entré en Swift en 2016 y esta respuesta es de 2014, ¿entonces quizás las cosas solían ser diferentes?Otra opción es hacer que el consumidor de la matriz se lo pida al propietario según sea necesario. Por ejemplo, algo en la línea de:
Luego puede modificar la matriz tanto como desee dentro de la clase Cuenta. Tenga en cuenta que esto no le ayuda si también desea modificar la matriz desde la clase de controlador de vista.
fuente
Usar
inout
es una solución, pero no me parece muy rápido ya que las matrices son tipos de valor. Estilísticamente, personalmente prefiero devolver una copia mutada:fuente
inout
es universalmente mejor porque ahorra batería. A lo que diría que la legibilidad, la inmutabilidad y la seguridad de subprocesos de esta solución son universalmente mejores y que inout solo debe usarse como una optimización en aquellos casos raros donde el caso de uso lo justifica.use a
NSMutableArray
o aNSArray
, que son clasesde esta manera no necesita implicar ningún envoltorio y puede usar la compilación en el puente
fuente