2014-07-20 70 views
-2
var sourceEntries: [Entry] = [entry1, ..., entry14] 
var myDict: Dictionary<String, [Entry]> = [:] 

for entry in sourceEntries { 

    if var array = myDict[entry.attribute1] { theArray.append(entry) } 
    else { myDict[entry.attribute1] = [entry] } 

} 

我打算建立一個詞典,其結構「Eintrag」的所有對象與來自源陣列相同的屬性相匹配「alleEinträge」爲包含共享屬性值的字符串。出於某種原因,我的最終字典只是將一個元素的數組匹配到字符串,儘管有些數組最多應包含四個元素。創建字典<字符串,[SomeStruct]>從[SomeStruct]源陣列

回答

0

問題是數組是通過值(即「複製」)傳遞的,因此當您說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]]() 

現在我將創建字典!我們的想法是使用mapfilter一起做創建鍵值對,然後我們剛剛建立的字典從那些對所有的工作:

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 } 
+0

此行爲測試3.改變它的更清楚了 - 數組總是按值傳遞 - 但是,正如我的答案所暗示的,你有時需要做更多的工作。 – matt

+0

非常感謝,但正如我剛剛所認識到的那樣,Array是由結構組成的。難道他們在重新分配時的行爲與階級不同嗎? –

+0

我不明白與它有什麼關係。 – matt

相關問題