Ios 创建字典<;字符串,[SomeStruct]>;来自[SomeStruct]源阵列 var sourceEntries:[Entry]=[entry1,…,entry14] var myDict:Dictionary=[:] 对于sourceEntries中的条目{ 如果var array=myDict[entry.attribute1]{theArray.append(entry)} else{myDict[entry.attribute1]=[entry]} }
我打算创建一个字典,将源数组“alleEinträge”中具有相同属性的结构“Eintrag”的所有对象与包含共享属性值的字符串相匹配。出于某种原因,我的最终字典只将一个元素的数组与字符串匹配,尽管有些数组应该最多包含四个元素。问题是数组是按值传递的(即“复制”),因此当你说Ios 创建字典<;字符串,[SomeStruct]>;来自[SomeStruct]源阵列 var sourceEntries:[Entry]=[entry1,…,entry14] var myDict:Dictionary=[:] 对于sourceEntries中的条目{ 如果var array=myDict[entry.attribute1]{theArray.append(entry)} else{myDict[entry.attribute1]=[entry]} },ios,swift,Ios,Swift,我打算创建一个字典,将源数组“alleEinträge”中具有相同属性的结构“Eintrag”的所有对象与包含共享属性值的字符串相匹配。出于某种原因,我的最终字典只将一个元素的数组与字符串匹配,尽管有些数组应该最多包含四个元素。问题是数组是按值传递的(即“复制”),因此当你说array.append时写入的数组不是字典中的数组。如果你想改变字典里的内容,你必须明确地写回字典 在一个简单的情况下尝试: var sourceEntries: [Entry] = [entry1, ..., entry
array.append时写入的数组不是字典中的数组。如果你想改变字典里的内容,你必须明确地写回字典
在一个简单的情况下尝试:
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] }
}
正如你所见,“4”这个词从未被收录进字典
你必须明确地写回字典:
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]]
进一步思考:你让我思考是否有一种更优雅的方式来完成你想做的事情。我不确定你是否会认为这是“更优雅”,但也许它有一些吸引力
首先,我将设置一个带有name
属性的结构(如您的条目):
if var array = dict["entry"] { array.append(4); dict["entry"] = array }
现在,我将创建一个类似于您的sourceEntries
数组的数组,其中一些结构共享相同的name
(类似于您的共享属性attribute1
):
当然,我会准备空字典,就像你的myDict
,我称之为d
:
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]
现在我将创建字典!我们的想法是一起使用map
和filter
来完成创建键值对的所有工作,然后我们就从这些键值对中构建字典:
var d = [String : [Thing]]()
这种行为在beta 3中发生了变化。现在更清楚了——数组总是按值传递的——但是,正如我的回答所暗示的,有时候你需要做更多的工作。非常感谢你,但正如我刚刚认识到的,数组是由结构组成的。他们在重新分配任务时的表现是否与班级稍有不同?我不知道这与此有什么关系。我想了另一种方法。。。请参阅我对我的答案的编辑。
var d = [String : [Thing]]()
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 }