如何改变字典中的数组?
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 Array
和 Dictionary
不是像 NSArray
和 NSDictionary
这样的对象。他们是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]]
添加了一些糖分,如果给定一个当前没有附加数组的字典键,它实际上会创建一个新数组。
我在 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 Array
和 Dictionary
不是像 NSArray
和 NSDictionary
这样的对象。他们是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)
第一个解决方案性能更高,因为它不会创建列表的临时副本。
在这里扩展优秀
选项 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]]
添加了一些糖分,如果给定一个当前没有附加数组的字典键,它实际上会创建一个新数组。