How to get a pointer (instead of a copy) to an array in Swift?

  • A+
Category:Languages

In Swift, assigning an array to a new variable actually makes of copy. For example (as in Apple doc for 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]" 

How do I actually get a pointer to the same array, so modifying the elements is reflected in the same array? (The reason for this is I access in static instances of another class, e.g. "SomethingManager.sharedInstance.arrayList[aKey]" and I'll like to shorten it to an assigned pointer variable.)

(I'm interested to know how to do this in Swift 4 and 5. I don't see any existing question for Swift language.) Thanks!

EDIT:

I'm providing my rationale for the need to have a pointer instead of a copy.

Say, I have the following code:

var childrenTasks = [Int64: [TaskRef]]() 

defined in a class, which is accessed:

MyClass.singleton.parentTask[parentTaskID].childrenTask[taskRefID] 

As you can see that the code to access childrenTask is very long. I'd like to have a pointer, just an illustration :-

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 

It will help make my code easier to read. I need a pointer to manipulate the same set of values so I use a "var". If it is only read-only, I can use a "let", but still it has performance penalty if I get a copy.

How do I get a pointer in Swift? Is this possible? (I know that in Kotlin it is possible as it is pass-by reference.)

EDIT: I see some suggestion that this question is a duplicate. No, it is not. Those other questions/answers are specifically focused on inout parameters. For my case, I just want a pointer to work in the same function/method.

 


Not a ‘pure’ Swift solution, but using NSArray will give you the reference semantics you desire.

NSArray is toll-free bridgeable to Array, so you can use plain as instead of 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]

If you are modifying the 'copy' you will need to use a NSMutableArray.

Edit: oops 🤭 I think I was confused by the naming of your variable numbersCopy. I see now that you want the 'copy' to share the same value as the original. By capturing the variable numbers in a block, and executing that block later, you can get the current value of numbers, and you don't need to use NSArray at all.

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]

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: