Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

322
Vistas
¿Cómo obtener un puntero (en lugar de una copia) a una matriz en Swift?

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 array

Ayudará 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.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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]

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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]"
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda