如何在字典中改变数组?

Joe*_*ith 4 dictionary immutability swift

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

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

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

println(d1)
Run Code Online (Sandbox Code Playgroud)

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

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

jfo*_*cht 9

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

var a1 = d1["a"]!
Run Code Online (Sandbox Code Playgroud)

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

a1.append("s1")
Run Code Online (Sandbox Code Playgroud)

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

选项1:直接附加到内部数组d1.

var d1 = [String : [String]]()
d1["a"] = [String]()
d1["a"]?.append("s1")
println(d1)
Run Code Online (Sandbox Code Playgroud)

选项2:追加到一个复制的阵列和值分配给"a"d1.

var d1 = [String : [String]]()
d1["a"] = [String]()
var a1 = d1["a"]!
a1.append("s1")
d1["a"] = a1
println(d1)
Run Code Online (Sandbox Code Playgroud)

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