umali
umali

Reputation: 195

How to make shallow copy of array in swift

I have searched for a while but couldn't find reasonable answer for this. I want to add/remove objects in one array to make effect in 2nd array which points to first array.

class Person
{
    var name:String = ""
}

var arr1:[Person] = [Person]()

let p1 = Person()
p1.name = "Umair"

let p2 = Person()
p2.name = "Ali"

arr1.append(p1)
arr1.append(p2)
var arr2 = arr1

print("\(arr1.count)")    //"2\n"
print("\(arr2.count)")    //"2\n"

arr1.removeFirst()

print("\(arr1.count)")    //"1\n"
print("\(arr2.count)")    //"2\n"

Why changing arr1 does not affect arr2. Please help me out to accomplish this.

Upvotes: 1

Views: 2692

Answers (2)

JRG-Developer
JRG-Developer

Reputation: 12663

Even if you're using Swift, you can still use NSArray.

Per Apple's documentation,

NSArray is an object representing a static ordered collection, for use instead of an Array constant in cases that require reference semantics.

The only downside is you'll have to import Foundation. This isn't a problem if you're creating an iOS or Mac app, as you're depending on it already.

Upvotes: 2

Price Ringo
Price Ringo

Reputation: 3440

Arrays are value types. When we copy them, each copy is independent of the other. This is a virtue in Swift. What you are trying to do requires references so that effects on one can be seen by others. Try this code. Create a class (reference type) containing your data. Now changes to the container can be seen in the other.

class Person
{
  var name: String

  init(_ name: String) {
    self.name = name
  }
}

let p1 = Person("Umair")
let p2 = Person("Ali")


class Container {
  var people = [Person]()

  init(people: [Person]) {
    self.people = people
  }
}

let arr1 = Container(people: [p1, p2])
let arr2 = arr1

print(arr1.people)
print(arr2.people)

arr1.people.removeFirst()

print(arr1.people)
print(arr2.people)

enter image description here

Upvotes: 8

Related Questions