Это заняло у меня секунду, чтобы понять, поэтому я не обвиняю вас в недостатке.
Связанный с JSON миниатюрный, поэтому трудно увидеть структуру. Давайте посмотрим на (фрагмент) его после того, как конвейеру через a prettifier:
[
{
"PlayerId":2501863,
"PlayerName":"Peyton Manning",
"PlayerTeam":"DEN",
"PlayerPosition":"QB",
"PlayerPassingYards":4727,
"PlayerPassingTDs":39,
"PlayerInterceptions":15,
"PlayerRushingYards":-24,
"PlayerRushingTDs":0,
"PlayerReceivingYards":0,
"PlayerReceivingTDs":0,
"PlayerReturnYards":0,
"PlayerReturnTDs":0,
"PlayerFumbleTDs":0,
"PlayerTwoPointConversions":2,
"PlayerFumblesLost":2,
"PlayerTeamLogo":"http://i.nflcdn.com/static/site/7.0/img/logos/teams-gloss-81x54/den.png"
}
]
Ха. Он заключен в скобки, что означает, что это массив .
Это массив, поэтому вы не можете отличить его как NSDictionary
. Вместо этого вы можете использовать его как NSArray
, но почему бы не использовать собственные типы Swift?
Ну, если вам не нравятся типы, вы узнаете об этом, но я все же думаю, что это лучший способ, потому что он заставляет вас думать о данных, которые вы разбираете.
Итак, у нас есть первая часть нашего определения типа для этой функции; это массив ([]
). Какие компоненты составляют наши массивы? Мы могли бы пойти с простым NSDictionary
, но здесь мы делаем полные родные типы, поэтому давайте использовать a native Swift dictionary.
Для этого мы должны знать типы словаря (синтаксис для родного словарного типа: [KeyType: ValueType]
). Изучение JSON показывает, что все ключи: String
s, но значения имеют разные типы, поэтому мы можем использовать AnyObject
.
Это дает нам тип словаря [String: AnyObject]
, и весь наш JSON является массивом этого, поэтому конечный тип - [[String: AnyObject]]
(wow).
Теперь, когда у нас есть правильный тип, мы можем изменить функцию, которую вы используете, для синтаксического анализа JSON.
Прежде всего, давайте воспользуемся нашим новым типом для значений возврата и отливки. Затем давайте сделаем возвращаемый тип optional в случае, если что-то пойдет не так, и добавьте переменную error
для ее документирования.
Очищенная вверх функция будет выглядеть примерно так:
func getData() -> [[String: AnyObject]]? {
let data: NSData? = NSData(contentsOfURL: NSURL(string: "http://nfl-api.azurewebsites.net/myplayers.json")!)
if let req: NSData = data {
var error: NSError?
if let JSON: [[String: AnyObject]] = NSJSONSerialization.JSONObjectWithData(req, options: NSJSONReadingOptions.AllowFragments, error: &error) as? [[String: AnyObject]] {
return JSON
}
}
return nil
}
Вот оно!
Теперь мы можем вызвать функцию и извлекать значения от наших [[String: AnyObject]]
(опять же, ничего себе), как это:
if let data: [[String: AnyObject]] = getData() {
println(data[0]["PlayerName"]!) // Peyton Manning
}
Что такое сообщение об ошибке? –
Тема 1: EXC_BAD_ACCESS (код = 2, адрес = 0x102475138) – Davemen
Вы слышали о дополнительных вариантах? –