4

我从 php.ini 重写了这段代码。而且我发现很难让它快速工作。

var arrayOfData = [AnyObject]()

for index in 1...5 {
    var dict = [String: AnyObject]()
    dict["data"] = [1,2,3]
    dict["count"]  = 0

    arrayOfData.append(dict)
}

for d in arrayOfData {

    let data = d as AnyObject

    // I want to update the "count" value
    // data["count"] = 8
    print(data);
    break;
}
4

2 回答 2

6

据推测,您想在arrayOfData分配时更新内部的值data["count"] = 8。如果您切换到使用NSMutableArrayand NSMutableDictionary,那么您的代码将按照您的意愿运行。这样做的原因是这些类型是引用类型(而不是像 Swift 数组和字典这样的值类型),所以当你使用它们时,你是在引用它们内部的值而不是复制。

var arrayOfData = NSMutableArray()

for index in 1...5 {
    var dict = NSMutableDictionary()
    dict["data"] = [1,2,3]
    dict["count"] = 0

    arrayOfData.addObject(dict)
}

for d in arrayOfData {
    let data = d as! NSMutableDictionary
    data["count"] = 8
    print(data)
    break
}
于 2016-06-18T21:28:34.857 回答
5

假设您的数组必须是 '[AnyObject]' 的形式,然后是这样的:

var arrayOfData = [AnyObject]()

for index in 1...5 {
    var dict = [String: AnyObject]()
    dict["data"] = [1,2,3]
    dict["count"]  = 0

    arrayOfData.append(dict)
}

for d in arrayOfData {

    // check d is a dictionary, else continue to the next 
    guard let data = d as? [String: AnyObject] else { continue }

    data["count"] = 8
}

但最好将您的数组输入为字典数组:

var arrayOfData = [[String: AnyObject]]()

for index in 1...5 {
    var dict = [String: AnyObject]()
    dict["data"] = [1,2,3]
    dict["count"]  = 0

    arrayOfData.append(dict)
}

for d in arrayOfData {
    // swift knows that d is of type [String: AnyObject] already
    d["count"] = 8
}

编辑:

所以问题是当你在循环中修改时,你正在从数组中创建一个新版本的字典,并且需要将它传回。尝试使用地图:

arrayOfData = arrayOfData.map{ originalDict in
    var newDict = originalDict
    newDict["count"] = 8
    return newDict
}
于 2016-06-18T21:15:17.390 回答