2016-03-01 75 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應用程序,這不是問題,因爲您已經依賴它。