从[SomeStruct] source-array </string,>创建Dictionary <string,[somestruct] =“”>

时间:2014-07-20 19:28:53

标签: ios swift

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] }

}

我打算创建一个Dictionary,它将结构“Eintrag”的所有对象与source-Array“alleEinträge”中的相同属性匹配到包含shared属性值的String。出于某种原因,我的最终字典只是将一个元素的数组与字符串匹配,尽管某些数组应该包含最多四个元素。

1 个答案:

答案 0 :(得分: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 }