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,但是从长远来看,这似乎并没有实际修改数组本身.我究竟做错了什么?
默认情况下,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建议使用自定义类通常是最好的选择.
| 归档时间: |
|
| 查看次数: |
4537 次 |
| 最近记录: |