如何在swift中制作数组的浅表副本

时间:2016-03-01 06:33:48

标签: arrays swift nsmutablearray shallow-copy

我已经搜索了一段时间但是找不到合理的答案。我想在一个数组中添加/删除对象,以便在指向第一个数组的第二个数组中生效。

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"

为什么更改arr1不会影响arr2。请帮我完成这件事。

2 个答案:

答案 0 :(得分:8)

数组是值类型。当我们复制它们时,每个副本都独立于另一个副本。这是斯威夫特的一种美德。您要做的是需要参考,以便其他人可以看到对一个人的影响。试试这个代码。创建一个包含数据的类(引用类型)。现在可以在另一个中看到对容器的更改。

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

答案 1 :(得分:0)

即使您正在使用Swift,您仍然可以使用NSArray

根据Apple的文档,

  

NSArray是一个表示静态有序集合的对象,用于在需要引用语义的情况下使用而不是Array常量。

唯一的缺点是你必须import Foundation。如果您正在创建iOS或Mac应用,这不是问题,因为您已经依赖它了。