2016-06-18 3 views
2

Я переписываю этот код с php. И мне трудно заставить его работать быстро.Как обновить значение словаря swift

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; 
} 
+1

Почему вы используете какой-либо объект, когда знаете, что это словарь? – Wain

ответ

5

Предположительно, вы хотите, чтобы обновить значение внутри arrayOfData при назначении data["count"] = 8. Если вы переключитесь на использование NSMutableArray и 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 
} 
+0

Удивительный, спасибо! Но сравните с решением @SeanCAtkinson с использованием map.Which лучше, производительность говорит – Ben

+0

'map' воссоздает' arrayOfData', который будет менее эффективен, чем этот, поскольку вы напрямую обращаетесь к элементам 'arrayOfData' и меняете их. – vacawama

+0

Да, я вижу. И как удалить «let data ...» и сделать «d» с типом NSMutableDictionary? – Ben

3

Если предположить, что массив должен иметь форму «[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 
} 

EDIT:

Таким образом, проблема заключается в том, что при изменении в цикле вы создаете новую версию словарь из массива и передать его обратно. Попробуйте использовать карту:

arrayOfData = arrayOfData.map{ originalDict in 
    var newDict = originalDict 
    newDict["count"] = 8 
    return newDict 
} 
+0

ошибка: не может назначить через нижний индекс: «d» представляет собой «пусть» постоянной D [ «подсчет»] = 8 – Ben

+0

изменить второй цикл, чтобы: для вар д в arrayOfData – SeanCAtkinson

+0

правильно, но в arrayOfData каждый «счет» по-прежнему 0 – Ben

Смежные вопросы