#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