Swift NSMutableDictionary 解析 json 失败

Swift NSMutableDictionary parsing json fails

我对 NSMutableDictionary 和 Alamofire 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

为什么我无法访问 "id" 密钥?我不能像这样解析 json 吗?有人告诉我尝试 SwiftyJSON,这种方式根本不可能。所有这些问题都发生在我更新到 Xcode 7.3 和 cocoapods 1.0.0.

之后

基础集合类型不包含类型信息,可变版本 NSMutableArrayNSMutableDictionary 与 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:考虑将重复循环中的所有值分别分配给相同的变量categoryIDcategoryName,这意味着该值将在每次迭代中被覆盖。