2015-09-17 3 views
2

Я относительно новичок в Swift и программировании. Я разрабатываю приложение, которое в значительной степени зависит от информации, загруженной с сервера. Поэтому во многих ViewControllers я использую NSURLSession и NSJSONSerialization для загрузки JSON в мое приложение.Swift 2 - Типовое литье и дополнительная цепочка

Каждый раз, когда я хотел подстроить словарь, например timetableDict?["timetable"]["class"]["day"]["lesson"][0]["name"], что-то вроде Cannot subscript a value of type [String : AnyObject] with an index type of String появляется как ошибка.

Я понимаю, что следует избегать использования AnyObject в моем коде, но словарь с сервера сильно вложен структур, как это одна:

"timetable": ["class": ({ 
         day = ({ 
          lesson = ({ 
            name = (MATHEMATICS, ENGLISH), 
            classOrder = 0, 
            teacher = (Someone) 
             }), 
            ({ 
            name = FRENCH, 
            classOrder = 1, 
            teacher = (Someone) 
            )} 
           )} 
         )}] 

Проблема с этой структурой является то, что она сильно вложенной и имеет разные типы, когда он добирается до «name», «classOrder» и «teacher». Мне очень сложно не использовать AnyObject. Однако эта ошибка очень раздражает меня в течение очень долгого времени. Я был бы очень признателен, если бы кто-то мог помочь мне в этом. Заранее спасибо!

+0

Существует сильное несоответствие импеданса между почти безразличием JSON и Swift от «OMG», я должен знать тип точного * всего ». Это делает синтаксический анализ JSON PITA в Swift (мы все были там!). Есть несколько библиотек, чтобы смазать это несоответствие и облегчить вашу боль. –

ответ

2

Я предлагаю взглянуть на SwiftyJSON: https://github.com/SwiftyJSON/SwiftyJSON

Это основа/библиотека, предназначенная для обработки JSON в очень гораздо более элегантный способ чем то, что строить в быстрые (особенно для тяжелых вложенных структур, как ваша). Он прост в использовании и имеет отличный учебник.

EDIT: (Добавлен пример кода)

Пример из учебника swiftyJSON:

пусть JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData (данные, параметры: ноль, ошибка: ноль)

if let statusesArray = JSONObject as? [AnyObject], 
    let status = statusesArray[0] as? [String: AnyObject], 
    let user = status["user"] as? [String: AnyObject], 
    let username = user["name"] as? String { 
    // Finally we got the username 
} 

даже с дополнительным сцепление довольно запутанна:

пусть JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData (данные, параметры: ноль, ошибка: ноль)

if let username = (((JSONObject as? [AnyObject])?[0] as? [String: AnyObject])?["user"] as? [String: AnyObject])?["name"] as? String { 
    // What a disaster 
} 

С swiftyJSON

let json = JSON(data: dataFromNetworking) 
if let userName = json[0]["user"]["name"].string { 
    //Now you got your value 
} 
0

SwiftlyJSON что @Glenn упоминает не плохая система (хотя я считаю его чрезмерно полагаться на поиск строк, который является хрупким). Тем не менее, более глубокая точка заключается в том, что вы хотите проверить и проанализировать свой JSON в одном месте и превратить его в структуру данных, отличную от JSON Swift, для использования остальной частью вашей программы. SwiftlyJSON может быть достойным инструментом для этого, но я бы использовал его для выгрузки данных в массив структур.

Работа с JSON по всей вашей системе чрезвычайно подвержена ошибкам и громоздка, даже завернутая в SwiftlyJSON. Если вы разгрузите данные один раз, вы можете проверить ошибки один раз и везде, где вы знаете, что данные верны. Если вы проходите вокруг структур JSON, вы должны проверять каждый раз и обрабатывать, возможно, отсутствующие или неверные данные. Подумайте, в каком случае сервер отправляет вам JSON в формате, которого вы не ожидали. Сколько раз вы хотите проверить это?

+1

Хорошее замечание Роб. Это первое, что я делаю, когда получаю данные JSON: проверяю и помещаю в свои собственные модели.Не только для того, чтобы быть менее громоздким, но и для того, чтобы быть в состоянии выбрать лучший способ хранения моей даты и вынести наиболее эффективный способ посмотреть вещи (массивы и словари против SQL-хранилища, плоские или связанные, ...). Я использую swiftyJSON для этого, но потом только мои собственные модели/структуры данных. – Glenn