2015-02-18 3 views
1

Я изо всех сил пытаюсь выполнить цикл значений словаря, возвращаемых из вызова веб-службы.Swift: Looping через массив словаря

Я реализовал следующий код, и, похоже, я столкнулся с крахом при запуске.

Я также хотел бы сохранить результаты в пользовательский Struct. На самом деле с этим трудно справиться, и ответы на них до сих пор не сработали. Был бы признателен, если кто-то сможет помочь.

let nudgesURLString = "http://www.whatthefoot.co.uk/NUDGE/nudges.php" 
    let nudgesURL = NSURL(string: nudgesURLString) 

    let session = NSURLSession.sharedSession() 

    let task = session.dataTaskWithURL(nudgesURL!, completionHandler: {data, response, error -> Void in 

     if error != nil { 
      println(error) 
     } else { 

      let nudgesJSONResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 

      let nudges: NSDictionary = nudgesJSONResult["nudges"] as NSDictionary 

      if let list = nudgesJSONResult["nudges"] as? [[String:String]] { 
       for nudgeDict in list { 
        let location = nudgeDict["location"] 
        println(location) 
       } 
      } 

     } 

    }) 

    task.resume() 

} 
+1

Куда деградирует? Как выглядят данные JSON? Возможно, это JSON * массив *, а не * словарь * ?? В этом случае «как NSDictionary» будет сбой (и эта проблема возникает каждый день здесь на SO ...) –

+0

Вы назначаете 'nudgesJSONResult [" nudges "]' в словарь - 'nudges' и массив словари 'list' в вашей необязательной привязке (если пусть ...). Это может быть началом некоторых вопросов, но, как указал Мартин Р, вопрос неясно, в чем проблема. – Logan

+0

Вопросы поиска справки по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. –

ответ

2

УВЕДОМЛЕНИЕ

Этот ответ был написан с использованием Swift 1.2 и, как таковые, могут быть некоторые незначительные стилистические и синтаксические изменения, необходимые для ответа на работу в зависимости от текущего Swift системы.

Ответ - Swift 1,2

Эта линия разбив код:

let nudges: NSDictionary = nudgesJSONResult["nudges"] as NSDictionary 

Вы принуждать актерский Swift не может справиться. Вы никогда не подходите к своей петле.

Попробуйте изменить свой код, чтобы выглядеть следующим образом:

let nudgesURLString = "http://www.whatthefoot.co.uk/NUDGE/nudges.php" 
let nudgesURL = NSURL(string: nudgesURLString) 

let session = NSURLSession.sharedSession() 

let task = session.dataTaskWithURL(nudgesURL!, completionHandler: {data, response, error -> Void in 
    if error != nil { 
     println(error) 
    } else { 
     let nudgesJSONResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as [String : AnyObject] 
     if let nudges = nudgesJSONResult["nudges"] as? [[String : String]] { 
      for nudge in nudges { 
       let location = nudge["location"] 
       println("Got location: \(location)") 
       println("Got full nudge: \(nudge)") 
      } 
     } 
    } 

}) 

task.resume() 
+0

Спасибо! Это работало, боролось с этим часами. Раньше работал только с данными JSON в формате NSDictionary –

+0

Знаете ли вы, как лучше всего хранить данные, возвращенные в пользовательском Struct? –

+0

Вы просто определяете свою структуру и присваиваете свойства свойствам из каждого объекта 'nudge' и добавляете их в массив. Имеет ли это смысл? – Logan

0

Спасибо,

Я создал следующую структуру, которая хранится данные, а также позволяет мне создавать словари в контроллере представления для конкретного индекс.

struct NudgesLibrary { 

var location: NSArray? 
var message: NSArray? 
var priority: NSArray? 
var date: NSArray? 
var nudges: NSArray? 

init(nudgesObject: AnyObject) { 

    nudges = (nudgesObject["nudges"] as NSArray) 

    if let nudges = nudgesObject["nudges"] as? NSArray { 
     location = (nudges.valueForKey("location") as NSArray) 
     message = (nudges.valueForKey("message") as NSArray) 
     priority = (nudges.valueForKey("priority") as NSArray) 
     date = (nudges.valueForKey("date") as NSArray) 

    } 
    } 
} 
Смежные вопросы