2015-02-28 3 views
4

Я использую Alamofire и SwiftyJSON для получения и управления данными от API После создания моего первоначального запроса я в конечном итоге с вложенной коллекции типа JSONSwift JSON добавить новый ключ к существующему словарю

Согласно SwiftyJSON я могу Переберите данных как так https://github.com/SwiftyJSON/SwiftyJSON#loop

for (key: String, subJson: JSON) in json { 
    //Do something you want 
} 

Опять же, согласно SwiftyJSON я должен быть в состоянии установить новые значения, как так: https://github.com/SwiftyJSON/SwiftyJSON#setter

json["name"] = JSON("new-name") 

У меня есть вложенный набор данных, и я могу копать настолько глубоко, насколько хочу, но я не могу изменить объект и установить новую пару ключ: значение. Как мне это сделать в Свифт?

Вот мой код:

  for (key: String, stop: JSON) in stops { 
       var physicalStops = stop["physicalStops"] 
       for (key: String, physicalStop: JSON) in physicalStops { 
        println("Prints out \(physicalStop) just fine") 
        // physicalStop["myNewkey"] = "Somevalue" // DOES NOT WORK (@lvalue is not identical to 'JSON) 
        // physicalStop["myNewkey"] = JSON("Somevalue") //SAME Story 
       } 
      } 

В основном я хотел бы сохранить ту же самую структуру исходного объекта JSON, но добавить дополнительный ключ: значение на втором уровне вложенности для каждого суб объекта.

ответ

5

Во-первых, вы можете использовать var для цикла, чтобы значение изменялось внутри цикла. Однако JSON является структурой, поэтому он ведет себя как тип значения, поэтому в вашем вложенном примере вам нужно переназначить также дочерний JSON родительскому JSON, иначе он просто изменит значение внутри цикла, но не в исходной структуре.

var json: JSON = ["foo": ["amount": 2], "bar": ["amount": 3]] 
for (key: String, var item: JSON) in json { 
    println("\(key) -> \(item)") 
    item["price"] = 10 
    json[key] = item 
} 
println(json) 
+2

Приветствие, приятель, ты спас мою жизнь :) – kernelpanic

+0

Я рад, что я мог бы помочь! –

1

Ниже код, который прекрасно работает в Swift 2 площадки и не требуют Swifty:

var json: [String:AnyObject] = ["foo": ["amount": 2], "bar": ["amount": 3]] 
for (key,item) in json { 
    print("\(key) -> \(item)") 
    let newItem = ["price": 10] 
    json[key] = newItem 
} 
print(json) 
Смежные вопросы