Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

319
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!