2016-05-23 3 views
0

У меня есть некоторые странные проблемы синтаксического анализа с ответами NSMutableDictionary и Alomafire json.swift NSMutableDictionary синтаксический анализ json не работает

Alamofire.request(.POST, "\(Constants.apiUrl)/get_stuff", parameters: mapData, encoding:.JSON) 
    .responseJSON { response in 

     switch response.result { 
     case .Success(let data): 
      let info = data as! NSMutableDictionary 

      self.deleteCategoryFromCoreData() 

      if let categoryArray = info["category"] as? NSArray{ 
       for var i = 0; i < categoryArray.count; i++ { 
        self.categoryID = categoryArray[i]["id"] as? Int <-- error here 
        self.categoryName = categoryArray[i]["name"] as? NSString 
        self.saveCategoryDataToCoreData() 
       } 
      } 

Я не знаю, почему это не удается:

(lldb) po categoryArray[i]["id"] 
2016-05-23 20:59:56.892 MyProject[9799:5005782] -[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000013 
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3).. 
The process has been returned to the state before expression evaluation. 

, но это не обязательно:

(lldb) po categoryArray[i]["name"] 
▿ Optional<String> 
    - Some : "Animals" 

Вот данные:

(lldb) po categoryArray[i] 
▿ 2 elements 
    ▿ [0] : 2 elements 
    - .0 : id 
    ▿ [1] : 2 elements 
    - .0 : name 
    - .1 : Animals 

Почему косяк доступ I Ключ «id»? Я не могу разобрать Json так? Мне сказали попробовать SwiftyJSON, этот способ вообще невозможен. Вся эта проблема возникла после обновления xcode 7.3 и cocoapods 1.0.0. Благодарю. Пожалуйста помоги ?

ответ

1

Типы фондов фонда не содержат информации о типе, а изменчивые версии NSMutableArray и NSMutableDictionary не относятся к Swift-аналогам вообще.

Использование Swift собственные типы для всего

Alamofire.request(.POST, "\(Constants.apiUrl)/get_stuff", parameters: mapData, encoding:.JSON) 
    .responseJSON { response in 

    switch response.result { 
    case .Success(let data): 
     let info = data as! [String:AnyObject] 

     self.deleteCategoryFromCoreData() 

     if let categoryArray = info["category"] as? [[String:AnyObject]] { 
     for category in categoryArray { 
      self.categoryID = category["id"] as? Int 
      self.categoryName = category["name"] as? String 
      self.saveCategoryDataToCoreData() 
     } 
     } 

Если вы все еще получаете ошибку, чем значение для ключа id является строкой

if let id = category["id"] as? String { 
    self.categoryID = Int(id) 
} 

PS: Учтите, что вы назначаете все значения в повторе цикл к тем же переменным categoryID и categoryName соответственно, это означает, что значение будет перезаписано на каждой итерации.

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