2015-10-10 69 views
0

簡而言之,我創建了一個由Integer和一個字符串數組組成的對象。 我把東西放到整數和數組中 我把對象放到字典中
我得到了一個新的對象引用並試圖追加到數組。這是它失敗快速參考與數組和字典的值

//: Playground - noun: a place where people can play 

class IdAndArray { 
    var id: Int = 0 
    var stringArray:[String] = [String]() 
} 

var dict:[Int:IdAndArray] = [Int:IdAndArray]() 

var testRec = IdAndArray() 
testRec.id = 1 
testRec.stringArray.append("1 line") 

dict[56] = testRec 

var ref = (dict[56]?.stringArray)! 
print(ref.count) // 1 
ref.append("2 line") 

var anotherRef = (dict[56]?.stringArray)! 
print(anotherRef.count) // 1 instead of 2??? 

我懷疑這可能與此有關: Implementing a multimap in Swift with Arrays and Dictionaries

我也懷疑這是值得做的自選項目,但我強迫與解包!

爲了記錄,我來自java背景。

回答

2

Swift數組和字典是類型。將一個變量中的變量分配給另一個變量時,您正在複製原始文件。

所以,當你這樣做:

var ref = (dict[56]?.stringArray)! 

ref是數組的一個全新的副本,而不是一個在字典中,因此修改它在字典中的原件沒有影響。

相反,如果你做了:

dict[56]?.stringArray.append("2 line") 

那麼你就修改了在字典中的副本。


注:在現實中,斯威夫特沒有,直到你修改其中一個副本進行數組的一個副本。這是在幕後完成的,以避免不必要的複製並保持快速。複製邏輯上在您分配時會立即發生,但在開始修改其中一個副本之前,您不會注意到區別,因此Swift會延遲副本,直到它重要。


現在考慮這個改變了代碼:

var ref = dict[56]! 
print(ref.stringArray.count) // 1 
ref.stringArray.append("2 line") 

var anotherRef = dict[56]! 
print(anotherRef.stringArray.count) // 2 this time!!! 

這裏,ref指向class的實例,它是一個參考類型。在這種情況下,refanotherRef都指向相同的對象,因此這次您正在修改字典中的數組。

+0

感謝您的教育!第二部分完美地工作,但是「(dict [56]?。stringArray)!. append(」2 line「)」會導致「錯誤:不能在操場上使用類型爲'[String]'的不可變值的變異成員」 xcode 7.01/swift 2.0 –

+0

嗯。試試'dict [56]?。stringArray.append(「2 line」)'。 – vacawama

+0

這個技巧。再次感謝! –