Массив словарей в Swift

#arrays #json #dictionary #swift

#массивы #json #словарь #swift

Вопрос:

Кажется, не могу найти правильный синтаксис. Пытаюсь получить массив dicts из файла json:

 let books:Array = jsonDict["books"] as Array
//Cannot convert the expression's type Array<$T4> to type StringLiteralConvertible

let books:Array = jsonDict["books"] as Array<Dictionary>
//Reference to generic type "Dicionary" requires arguments in <...>
  

json выглядит следующим образом:

 {
  "id": "1",
  "title": "title one",
  "books": [
    {
      "id": "1",
      "title": "book title one"
    },
    {
      "id": "2",
      "title": "book title two"
    }
    ]
}
  

Комментарии:

1. Array<Dictionary<String, String>> ?

2. вау, это некрасиво. но ладно…

Ответ №1:

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

То, что вы, вероятно, ищете, это:

 let books = jsonDict["books"]
  

Компилятор должен быть в состоянии определить, что там находится. Если нет, вы можете выполнить приведение с помощью:

 let books = jsonDict["books"] as Array<Dictionary<String, String>>
  

Наличие приведенного типа и спецификатора типа для книг не требуется.

Комментарии:

1. Я, конечно, предпочел бы первый, и, похоже, он работает. Однако я получаю предупреждение: предполагается, что константа ‘books’ имеет тип ‘AnyObject’, что может быть неожиданным.

2. Правильно, в таком случае, определенно используйте второй. Вероятно, это потому, что jsonDict имеет тип Dictionary<String, AnyObject> или что-то подобное, что дало бы вам AnyObject .

3. Работает ли это также с Swift 2? (Я получил сообщение об ошибке 'String?' is not convertible to 'Array<Dictionary<String, String>>')

Ответ №2:

В Swift 2 работает приведение типов, как показано ниже!

[[Строка: AnyObject]]

Я тестировал на примере

 -{
"city" :  { ... },
"cod" : 200,
"message" : 0.0068,
"cnt" : 6,
"list" : -[
-{
"dt" : 1461369600,
"main" :  { ... },
"weather" :  [ ... ],
"clouds" :  { ... },
"wind" :  { ... },
"rain" :  { ... },
"sys" :  { ... },
"dt_txt" : 2016-04-23 00:00:00
},
 { ... },
 { ... },
 { ... },
 { ... },
 { ... }
]
}
  

Код swift выводится следующим образом

 let theJSONData = try NSJSONSerialization.JSONObjectWithData(theData!, options: NSJSONReadingOptions.MutableContainers) as! [String:AnyObject]

let theList = theJSONData["list"] as! [[String: AnyObject]] // Array of Dictionaries
let dayOneWeather = theList[0]
let mainDayOneWeather = dayOneWeather["main"] as! [String:AnyObject]
let dayOneTemperature = mainDayOneWeather["temp"] as! Int
let dayOneTemperatureInDegreeCelsius = dayOneTemperature - 273