2016-03-05 3 views
0

Я создаю простое приложение, которое показывает детали каждого символа для Star Wars с помощью SWAPI. Теперь я пытаюсь получить вид, но Xcode говорит мне, что нашел нуль, разворачивая необязательное значение при попытке распечатать _species. Вот код:синтаксический разбор JSON не работает в Swift

func DownlaodCompleted(complete: DownloadComplete) { 
    let url = NSURL(string: _urlperson)! 
    Alamofire.request(.GET, url).responseJSON { (response: Response<AnyObject, NSError>) -> Void in 
     let result = response.result 

     if let dict = result.value as? Dictionary<String, AnyObject> { 

      if let height = dict["height"] as? String { 
       self._height = height 

      } 

      if let gender = dict["gender"] as? String { 
       self._gender = gender 
      } 

      if let birthYear = dict["birth_year"] as? String { 
       self._birthYear = birthYear 
      } 

      if let species = dict["species"] as? [Dictionary<String, String>] { 
       let urlSpecies = NSURL(string: self._urlSpecies)! 
       Alamofire.request(.GET, urlSpecies).responseJSON(completionHandler: { (response2: Response<AnyObject, NSError>) -> Void in 
        let result = response2.result 

        if let speciesDict = result.value as? Dictionary<String, AnyObject> { 
         if let name = speciesDict["name"] as? String { 
          self._species = name 
         } 
        } 
       }) 

      } 
      print(self._species) 
      print(self._height) 
     } 
    } 
} 

и здесь класс Константы:

let URL_BASE = "http://swapi.co" 
let URL_PEOPLE = "/api/people/" 
let URL_SPECIES = "/api/species/1/" 

typealias DownloadComplete =() -> () 
+0

проверить каждую операцию разворота (например, ваши конструкции URL-адресов). –

+0

Я думаю, все в порядке, я не вижу никаких проблем –

+1

:-) Если бы все было в порядке, мы бы не обсуждали это! – Russell

ответ

0

Вот пример кода, который я использовал после создания пустого «Single View Project», и добавление 2 «стручки» Alamofire, и SwiftyJON в проект.

Образец кода содержит один из ваших URL-адресов и URL-адрес с комментариями к другому сайту.

import UIKit 
import Alamofire 
import SwiftyJSON // No such module "SwiftyJSON" 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    @IBOutlet var tableView: UITableView! 
    var arrResults = [[String:AnyObject]]() //Array of dictionary 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480) 
     self.tableView = UITableView(frame:self.view!.frame) 
     self.tableView!.delegate = self 
     self.tableView!.dataSource = self 
     self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "jsonCell") 
     self.view?.addSubview(self.tableView) 

     Alamofire.request(.GET, "http://swapi.co/api/people/?format=json").responseJSON { (responseData) -> Void in 
      let swiftyJsonVar = JSON(responseData.result.value!) 
      for element in swiftyJsonVar["results"].arrayValue { 
       let name = element["name"].string! 
       let homeworld = element["homeworld"].string! 
       let object : Dictionary<String, String> = ["name": name, "homeworld": homeworld] 
       self.arrResults.append(object) 
      } 
      if self.arrResults.count > 0 { 
       self.tableView.reloadData() 
      } 
     } 

//  Alamofire.request(.GET, "http://api.androidhive.info/contacts/").responseJSON { (responseData) -> Void in 
//   let swiftyJsonVar = JSON(responseData.result.value!) 
//    
//   if let resData = swiftyJsonVar["contacts"].arrayObject { 
//    self.arrResults = resData as! [[String:AnyObject]] 
//   } 
//   if self.arrResults.count > 0 { 
//    self.tableView.reloadData() 
//   } 
//  } 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "jsonCell") 

     var dict = arrResults[indexPath.row] 
// Use these lines with: "http://swapi.co/api/people/?format=json" 
     cell.textLabel?.text = dict["name"] as? String 
     cell.detailTextLabel?.text = dict["homeworld"] as? String 
// Use these lines with: "http://api.androidhive.info/contacts/" 
//  cell.textLabel?.text = dict["name"] as? String 
//  cell.detailTextLabel?.text = dict["email"] as? String 
     return cell 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return arrResults.count 
    } 
}