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。出于某种原因,我的最终字典只是将一个元素的数组与字符串匹配,尽管某些数组应该包含最多四个元素。
答案 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]]()
现在我将创建字典!我们的想法是一起使用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 }