Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 创建字典<;字符串,[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

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

问题是数组是按值传递的(即“复制”),因此当你说
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 }