問題是數組是通過值(即「複製」)傳遞的,因此當您說array.append
不是字典中「數組」的數組時,您正在寫入的數組。如果你想改變它裏面的內容,你必須明確地回寫字典。
嘗試在一個簡單的情況:
var dict = ["entry":[0,1,2]]
// your code
if var array = dict["entry"] { array.append(4) }
// so what happened?
println(dict) // [entry: [0, 1, 2]]
正如你所看到的,「4」從來沒有到字典。
你必須寫回字典明確:
if var array = dict["entry"] { array.append(4); dict["entry"] = array }
的進一步思考:你讓我考慮是否有可能是一個更優雅的方式做你想要什麼做。我不確定你是否會認爲這是「更優雅」,但也許它有吸引力。
我會用name
屬性建立一個結構(如您的輸入)開始:
struct Thing : Printable {
var name : String
var age : Int
var description : String {
return "{\(self.name), \(self.age)}"
}
}
現在我將創建一個數組,像你sourceEntries
陣列,其中一些結構的共享相同的name
(喜歡你的共享屬性attribute1
):
let t1 = Thing(name: "Jack", age: 40)
let t2 = Thing(name: "Jill", age: 38)
let t3 = Thing(name: "Jill", age: 37)
let arr = [t1,t2,t3]
當然,我會準備好空字典,喜歡你的myDict
,我稱之爲d
:
var d = [String : [Thing]]()
現在我將創建字典!我們的想法是使用map
和filter
一起做創建鍵值對,然後我們剛剛建立的字典從那些對所有的工作:
let pairs : [(String, [Thing])] = arr.map {
t in (t.name, arr.filter{$0.name == t.name})
}
for pair in pairs { d[pair.0] = pair.1 }
此行爲測試3.改變它的更清楚了 - 數組總是按值傳遞 - 但是,正如我的答案所暗示的,你有時需要做更多的工作。 – matt
非常感謝,但正如我剛剛所認識到的那樣,Array是由結構組成的。難道他們在重新分配時的行爲與階級不同嗎? –
我不明白與它有什麼關係。 – matt