在Swift中修改字典数组

Dan*_*ana 3 arrays dictionary swift

我是Swift的新手,并且在解决Arrays和Dictionaries的某些方面时遇到了一些麻烦.

我有一系列字典,我使用了类型别名 - 例如

typealias myDicts = Dictionary<String, Double>

var myArray : [myDicts] = [
["id":0,
    "lat”:55.555555,
    "lng”:-55.555555,
    "distance":0],
["id":1,
    "lat": 44.444444,
    "lng”:-44.444444,
    "distance":0]
]
Run Code Online (Sandbox Code Playgroud)

然后我想迭代数组中的字典并更改"距离"键值.我是这样做的:

for dict:myDicts in myArray {

dict["distance"] = 5

}
Run Code Online (Sandbox Code Playgroud)

或者甚至特别确保5是双重的,有许多不同的方法,包括例如

for dict:myDicts in myArray {

let numberFive : Double = 5

dict["distance"] = numberFive

}
Run Code Online (Sandbox Code Playgroud)

我的所有尝试都会导致错误:

 @lvalue $T5' is not identical to '(String, Double)
Run Code Online (Sandbox Code Playgroud)

它似乎表现为里面的字典是不可变的"让"而不是"var".所以我随机尝试了这个:

for (var dict:myDicts) in myArray {

dict["distance"] = 5

}
Run Code Online (Sandbox Code Playgroud)

这样就消除了错误,并且在for循环中确实为key分配了5,但是从长远来看,这似乎并没有实际修改数组本身.我究竟做错了什么?

Mik*_*e S 5

默认情况下,Swift中for-in循环中隐式声明的变量是常量let,这就是为什么你不能直接在循环中修改它.

换文件中有这样的:

for index in 1...5 {
    println("\(index) times 5 is \(index * 5)")
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,index是一个常量,其值在循环的每次迭代开始时自动设置.因此,它不必在使用之前声明.它只是通过包含在循环声明中而隐式声明,而不需要let声明关键字.

正如您所发现的那样,您可以通过明确声明它来使其成为变量var.但是,在这种情况下,您尝试修改作为结构的字典,因此修改值类型,并在分配时复制它.当你这样做时,dict["distance"] = 5你实际上修改了字典的副本而不是存储在数组中的原始副本.

您仍然可以修改数组中的字典,只需通过索引循环遍历数组即可直接执行:

for index in 0..<myArray.count {
    myArray[index]["distance"] = 5
}
Run Code Online (Sandbox Code Playgroud)

这样,您一定要修改原始字典而不是它的副本.

话虽这么说,@ matt建议使用自定义类通常是最好的选择.