Arrays 在Swift中修改字典数组

Arrays 在Swift中修改字典数组,arrays,dictionary,swift,Arrays,Dictionary,Swift,我是Swift新手,在理解数组和字典的某些方面时遇到了一些困难 我有一个字典数组,其中我使用了类型别名-例如 typealias myDicts = Dictionary<String, Double> var myArray : [myDicts] = [ ["id":0, "lat”:55.555555, "lng”:-55.555555, "distance":0], ["id":1, "lat": 44.444444, "lng”:-

我是Swift新手,在理解数组和字典的某些方面时遇到了一些困难

我有一个字典数组,其中我使用了类型别名-例如

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]
]
或者甚至特别地确保5是一个具有许多不同方法的双精度,包括

for dict:myDicts in myArray {

let numberFive : Double = 5

dict["distance"] = numberFive

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

 @lvalue $T5' is not identical to '(String, Double)
看起来好像里面的字典是不可变的“let”而不是“var”。所以我随机尝试了这个:

for (var dict:myDicts) in myArray {

dict["distance"] = 5

}

这将删除错误,并且在for循环中确实为键分配了5,但从长远来看,这似乎并没有实际修改数组本身。我做错了什么?

你没有做错什么。这就是斯威夫特的工作原理。您有两个选择:

  • 使用NSMutableDictionary而不是Swift字典

  • 使用自定义类而不是字典。在某种程度上,这是一个更好的解决方案,因为在所有字典都具有相同结构的情况下,这是您一直应该做的

我所说的“自定义类”仅仅是一个“值类”,一组属性。这在Objective-C中是一种痛苦,但在Swift中它是微不足道的,所以我现在经常这样做。问题是,您可以将自定义类的类定义粘贴到任何地方;它不需要自己的文件,当然,在Swift中,您没有要处理的接口/实现foo,更不用说内存管理和其他东西了。因此,这只是几行代码,您可以直接使用已有的代码

下面是我自己代码中的一个示例:

class Model {
    var task : NSURLSessionTask!
    var im : UIImage!
    var text : String!
    var picurl : String!
}
然后我们有了一系列的模型,然后我们就开始了

因此,在您的示例中:

class MyDict : NSObject {
    var id = 0.0
    var lat = 0.0
    var lng = 0.0
    var distance = 0.0
}

var myArray = [MyDict]()

let d1 = MyDict()
d1.id = 0
d1.lat = 55.55
d1.lng = -55.55
d1.distance = 0
let d2 = MyDict()
d2.id = 0
d2.lat = 44.44
d2.lng = -44.44
d2.distance = 0
myArray = [d1,d2]

// now we come to the actual heart of the matter

for d in myArray {
    d.distance = 5
}
println(myArray[0].distance) // it worked
println(myArray[1].distance) // it worked

是的,在循环中检索到的字典是不可变的,因此不能更改。 恐怕你最后一次尝试只是创建了一个可变副本

一种可能的解决方法是使用
NSMutableDictionary

typealias myDicts = NSMutableDictionary

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

政府有:

for index in 1...5 {
    println("\(index) times 5 is \(index * 5)")
}
在上面的示例中,索引是一个常数,其值自动 在循环的每个迭代开始时设置。就其本身而言,情况并非如此 必须在使用前声明。它是隐式声明的 只需将其包含在循环声明中,而无需 let声明关键字

正如您所发现的,您可以通过使用
var
显式声明它来将其变为变量。然而,在本例中,您试图修改一个字典,它是一个结构,因此是一个,并且它在赋值时被复制。当您执行dict[“distance”]=5时,实际上是在修改字典的副本,而不是数组中存储的原始副本

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

for index in 0..<myArray.count {
    myArray[index]["distance"] = 5
}

对于0..中的索引,为Swift字典或数组提供类包装

class MyDictionary: NSObject {
var data : Dictionary<String,Any>!
init(_ data: Dictionary<String,Any>) {
    self.data = data
}}

MyDictionary.data
类MyDictionary:NSObject{
var数据:字典!
init(uu数据:字典){
self.data=数据
}}
MyDictionary.data

谢谢-使用自定义类似乎是个好主意。但在我的项目中,我在实现这一点上遇到了一些困难。。。你能给我举个例子,说明我的问题中的例子是如何起作用的吗?当然,但这是非常简单和明显的;我不应该为你写代码。对不起,我只是需要更多的澄清。这并不是说我需要为我的代码专门提供一个示例,而是在一个完整的环境中看到整个事情的实际运作,这对新手来说真的很有帮助。我现在明白了!请注意,在这里可以编写一个更优雅的值类。我只是向你展示尽可能少的课程!例如,如果类有一个合适的初始值设定项,这会好得多。:)
class MyDictionary: NSObject {
var data : Dictionary<String,Any>!
init(_ data: Dictionary<String,Any>) {
    self.data = data
}}

MyDictionary.data