2016-03-01 74 views
1

我已经搜索了一段时间,但找不到合理的答案。我想添加/删除一个数组中的对象,使其在第二个数组中指向第一个数组。如何在swift中制作数组的浅拷贝

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。请帮我解决这个问题。

+1

您的分配'var arr2 = arr1'实际上是'arr1'到'arr2'的一个惰性值副本,仅当两个数组中的任何一个发生了变异时才会生效。如果你真的想用_same references_跟踪一个数组,你必须看看Swift不安全的指针,我会避免。另一种方法(安全但有开销,可能忽略不计)是对'arr1'中的变化使用一些自定义属性观察器,并将变更委托给'arr2'。或者,查看[Swift reactive/binding/observing API:s](https://github.com/ReactiveKit/ReactiveKit),允许您绑定两个属性。 – dfri

回答

8

数组是值类型。当我们复制它们时,每个副本都是独立的。这在Swift中是一种美德。你想要做的事情需要引用,以便其他人可以看到其中的影响。试试这个代码。创建一个包含数据的类(引用类型)。现在可以在其他地方看到对容器的更改。

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

+0

这非常有帮助。 – umali

+0

我很高兴。请接受答案(绿色复选标记)。 –

+0

@PriceRingo做到了:) – umali

0

即使你用斯威夫特,你仍然可以使用NSArray

每苹果的文档,

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

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