如何在字典中改变数组?

时间:2015-03-22 01:24:00

标签: swift dictionary immutability

我在游乐场尝试了以下内容:

var d1 = [String: [String]]()
d1["a"] = [String]()

var a1 = d1["a"]!
a1.append("s1")

println(d1)

输出为:[a: []]
我希望:[a: ["s1"]]

在字典中改变数组的正确方法是什么?

4 个答案:

答案 0 :(得分:8)

在swift中,结构在被赋值给新变量时按值复制。因此,当您将a1分配给字典中的值时,它实际上会创建一个副本。这就是我所说的话:

var a1 = d1["a"]!

调用该行后,实际上有两个列表:d1["a"]引用的列表和a1引用的列表。因此,当您调用以下行时,只会修改第二个列表:

a1.append("s1")

当您进行打印时,您将打印第一个列表(存储为字典"a"中的键d1)。以下是两种可用于获得预期结果的解决方案。

选项1:直接附加到d1内的数组。

var d1 = [String : [String]]()
d1["a"] = [String]()
d1["a"]?.append("s1")
println(d1)

选项2:附加到复制的数组并将该值分配给"a"中的d1

var d1 = [String : [String]]()
d1["a"] = [String]()
var a1 = d1["a"]!
a1.append("s1")
d1["a"] = a1
println(d1)

第一种解决方案性能更高,因为它不会创建列表的临时副本。

答案 1 :(得分:1)

Swift ArrayDictionary不是NSArrayNSDictionary之类的对象。他们是struct。因此,执行var a1 = d1["a"]就像执行var a = point.x然后更改a,但当然point.x不会更改。

所以通过这样做:

d1["a"] = []
d1["a"]!.append("")

就像在做point.x = 10

答案 2 :(得分:1)

在此处扩展answer的优秀@jfocht

选项3:在通过引用传递数组的函数中追加

func myAdd(s : String, inout arr : [String]?) {
    if arr == nil
    {
        arr = [String]()
    }
    arr?.append(s)
}

var d1 = [String : [String]]()

myAdd("s1", &d1["a"])
myAdd("s2", &d1["b"])

println(d1) // [ b: [s2], a: [s1]]

在某种意义上添加了一些糖,如果给出一个当前没有附加数组的字典键,它实际上会创建一个新数组。

答案 3 :(得分:0)

您需要在字典中为键"a"设置新值。 这意味着:

d1["a"] = a1