如何改变字典中的数组?

How to Mutate an Array in a Dictionary?

我在 Playground 中尝试了以下方法:

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

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

println(d1)

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

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

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

d1["a"] = a1

Swift ArrayDictionary 不是像 NSArrayNSDictionary 这样的对象。他们是struct。所以通过 var a1 = d1["a"] 就像做 var a = point.x 然后改变 a 但当然 point.x 不会改变。

所以改为这样做:

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

会喜欢point.x = 10

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

var a1 = d1["a"]!

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

a1.append("s1")

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

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

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

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

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

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

在这里扩展优秀 of @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]]

添加了一些糖分,如果给定一个当前没有附加数组的字典键,它实际上会创建一个新数组。