2015-10-10 4 views
-1

Я работаю над своим первым проектом iOS Swift, и я столкнулся с трудностями с фатальной ошибкой. Это сообщение об ошибке неожиданно обнаруживает нуль при разворачивании необязательного значения только при получении сообщения об ошибке из вызываемого API.Как я могу исправить эту «Неустранимая ошибка: неожиданно найдено нуль при разворачивании дополнительного значения»?

Вот Swift код

@IBAction func pressScan(sender: AnyObject) { 

     let barcode = lastCapturedCode 

    print("Received following barcode: \(barcode)") 

    let url = "https://api.nutritionix.com/v1_1/item?upc=" 

    let urlWithUPC = url + barcode! + "&appId=[app ID goes here]&appKey=[app key goes here]" 

    print("API Query: "+urlWithUPC) 

    NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlWithUPC)!) { data, response, error in 
     // Handle result 
     print("Checked the bar code") 


     // let JSONData = NSData() 
     do { 
      let JSON = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions(rawValue: 0)) 


      guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else { 
       print("Not a Dictionary") 
       // put in function 
       return 
      } 
      print("JSONDictionary \(JSONDictionary)") 


      let foodScreenName = (JSONDictionary as NSDictionary)["item_name"] as! String 

      let foodBrandName = (JSONDictionary as NSDictionary)["brand_name"] as! String 


      let fullFoodName = foodBrandName + " " + foodScreenName 

      dispatch_async(dispatch_get_main_queue(),{ 

       self.foodName.text = fullFoodName 
      }); 



     } 
     catch let JSONError as NSError { 
      print("\(JSONError)") 
     } 



     }.resume 


} 

Вот результат JSON возвращается с ошибкой

JSONDictionary { 
"error_code" = "item_not_found"; 
"error_message" = "Item ID or UPC was invalid"; 
"status_code" = 404; 
} 

Вот результат JSON, если элемент найден с помощью API

JSONDictionary { 
    "item_id": "51c3d78797c3e6d8d3b546cf", 

    "item_name": "Cola, Cherry", 

    "brand_id": "51db3801176fe9790a89ae0b", 

    "brand_name": "Coke", 
    "item_description": "Cherry", 
    "updated_at": "2013-07-09T00:00:46.000Z", 
    "nf_ingredient_statement": "Carbonated Water, High Fructose Corn Syrup and/or Sucrose, Caramel Color, Phosphoric Acid, Natural Flavors, Caffeine.", 
    "nf_calories": 100, 
    "nf_calories_from_fat": 0, 
    "nf_total_fat": 0, 
    "nf_saturated_fat": null, 
    "nf_cholesterol": null, 
    "nf_sodium": 25, 
    "nf_total_carbohydrate": 28, 
    "nf_dietary_fiber": null, 
    "nf_sugars": 28, 
    "nf_protein": 0, 
    "nf_vitamin_a_dv": 0, 
    "nf_vitamin_c_dv": 0, 
    "nf_calcium_dv": 0, 
    "nf_iron_dv": 0, 
    "nf_servings_per_container": 6, 
    "nf_serving_size_qty": 8, 
    "nf_serving_size_unit": "fl oz", 
} 
+0

«неожиданно найдено нуль» В какой строке вашего кода? – matt

+0

Исправить? Никогда больше не используйте '!' (Кроме '! ='). Оберните все эти случаи в if-let или аналогичные конструкции. – HAS

+0

В ответе на ошибку также содержится JSON, поэтому перед тем, как попытаться проанализировать JSON в качестве найденного элемента, вы должны проверить его статусCode == 200. Также хорошая идея использовать? вместо ! при разборе полей в случае, если сервер не отправил их. –

ответ

1

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

if let screenName = (JSONDictionary as NSDictionary)["item_name"] { 
    foodScreenName = screenName as! String 
} 

if let brandName = (JSONDictionary as NSDictionary)["brand_name"] { 
    foodBrandName = brandName as! String 
} 
Смежные вопросы

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