我在游乐场尝试了以下内容:
var d1 = [String: [String]]()
d1["a"] = [String]()
var a1 = d1["a"]!
a1.append("s1")
println(d1)
输出为:[a: []]
我希望:[a: ["s1"]]
在字典中改变数组的正确方法是什么?
答案 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 Array
和Dictionary
不是NSArray
和NSDictionary
之类的对象。他们是struct
。因此,执行var a1 = d1["a"]
就像执行var a = point.x
然后更改a
,但当然point.x
不会更改。
所以通过这样做:
d1["a"] = []
d1["a"]!.append("")
就像在做point.x = 10
答案 2 :(得分:1)
选项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