En Swift, asignar una matriz a una nueva variable en realidad hace una copia. Por ejemplo (como en Apple doc para Array ):
var numbers = [1, 2, 3, 4, 5] var numbersCopy = numbers numbers[0] = 100 print(numbers) // Prints "[100, 2, 3, 4, 5]" print(numbersCopy) // Prints "[1, 2, 3, 4, 5]"¿Cómo obtengo un puntero a la misma matriz, de modo que la modificación de los elementos se refleje en la misma matriz? (La razón de esto es que accedo en instancias estáticas de otra clase, por ejemplo, "SomethingManager.sharedInstance.arrayList[aKey]" y me gustaría acortarlo a una variable de puntero asignada).
(Estoy interesado en saber cómo hacer esto en Swift 4 y 5. No veo ninguna pregunta existente para el lenguaje Swift).
EDITAR:
Estoy proporcionando mi justificación de la necesidad de tener un puntero en lugar de una copia.
Digamos que tengo el siguiente código:
var childrenTasks = [Int64: [TaskRef]]()definida en una clase, a la que se accede:
MyClass.singleton.parentTask[parentTaskID].childrenTask[taskRefID]Como puede ver, el código para acceder a childrenTask es muy largo. Me gustaría tener un puntero, solo una ilustración: -
var aPointerToChildrenTasks = MyClass.singleton.parentTask[parentTaskID].childrenTask[taskRefID] // I want a pointer, not a copy! aPointerToChildrenTask.remove(at: anIndex) // if it is a pointer, I can manipulate the same set of values of the arrayAyudará a que mi código sea más fácil de leer. Necesito un puntero para manipular el mismo conjunto de valores, así que uso una "var". Si solo es de solo lectura, puedo usar un "let", pero aun así tiene una penalización de rendimiento si obtengo una copia.
¿Cómo obtengo un puntero en Swift? es posible? (Sé que en Kotlin es posible ya que es una referencia de paso).
EDITAR: Veo alguna sugerencia de que esta pregunta es un duplicado. No, no es. Esas otras preguntas/respuestas se centran específicamente en los parámetros de entrada y salida. Para mi caso, solo quiero que un puntero funcione en la misma función/método.
No es una solución Swift 'pura', pero el uso de NSArray le dará la semántica de referencia que desea.
NSArray es un puente gratuito con Array , por lo que puede usar simple as en lugar de as!
var numbers = [1, 2, 3, 4, 5] var numbersCopy = numbers as NSArray numbers[0] = 100 print(numbers)[100, 2, 3, 4, 5]
print(numbersCopy as Array)[1, 2, 3, 4, 5]
Si está modificando la 'copia', deberá usar un NSMutableArray .
Edit: ups 🤭 Creo que estaba confundido por el nombre de su variable numbersCopy . Ahora veo que desea que la 'copia' comparta el mismo valor que el original. Al capturar los numbers variables en un bloque y ejecutar ese bloque más tarde, puede obtener el valor actual de los numbers y no necesita usar NSArray en absoluto.
var numbers = [1, 2, 3, 4, 5] var numbersCopy = {numbers} numbers[0] = 100 print(numbers)[100, 2, 3, 4, 5]
print(numbersCopy())[100, 2, 3, 4, 5]
Si se trata solo de conveniencia, considere hacer una función de utilidad como esta:
func withChildrenTasks(of parentTaskID: Int64, taskRefID: TaskRef, body: (inout [TaskRef]) -> ()) { body(&MyClass.singleton.parentTask[parentTaskID].childrenTasks[taskRefID]) } withChildrenTasks(of: parentTaskID, taskRefID: taskRefID) { tasks in // do stuff with tasks } No puede crear una "var de entrada y salida", pero siempre puede hacer una devolución de llamada que acepte un parámetro de entrada y inout , por lo que esta es una solución sencilla. Espero que el compilador Swift sea bastante bueno para optimizarlo.
Si es porque realmente desea compartir la referencia de la matriz, deberá envolverla en un tipo de referencia ( class SharedArray<T> { var array = [T]() } podría ser suficiente para ese propósito), o podría use NSMutableArray de Foundation.
Utilice una propiedad calculada:
var numbers = [1, 2, 3, 4, 5] var numbersCopy: [Int] { get { numbers } set { numbers = newValue } } numbers[0] = 100 print(numbers) // Prints "[100, 2, 3, 4, 5]" print(numbersCopy) // Prints "[100, 2, 3, 4, 5]" numbersCopy[1] = 200 print(numbers) // Prints "[100, 200, 3, 4, 5]" print(numbersCopy) // Prints "[100, 200, 3, 4, 5]"