2016-05-23 10 views
0

Ich habe einige seltsame Parsing-Probleme mit NSMutableDictionary und Alomafire JSON Antwort.swift NSMutableDictionary Parsing Json schlägt fehl

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() 
       } 
      } 

Ich weiß nicht, warum das nicht klappt:

(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. 

aber nicht scheitern:

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

Hier die Daten:

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

Warum kann ich Zugang "id" Schlüssel? Ich kann JSON so nicht parsen? Mir wurde gesagt, SwiftyJSON zu versuchen, auf diese Weise überhaupt nicht möglich. All dieses Problem ist aufgetreten, nachdem ich auf xcode 7.3 und cocoapods 1.0.0 aktualisiert habe. Vielen Dank. Bitte helfen Sie?

Antwort

1

Foundation-Sammlertypen enthalten keine Typinformationen, und die änderbaren Versionen NSMutableArray und NSMutableDictionary sind überhaupt nicht mit den Swift-Pendants verwandt.

Verwenden Swift native Typen für alles

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() 
     } 
     } 

Wenn Sie immer noch den Fehler als der Wert für die Schlüssel id erhalten, ist eine Zeichenfolge

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

PS: Bedenken Sie, dass Sie alle Werte in der Wiederholungs zuweisen Schleife zu den gleichen Variablen categoryID bzw. categoryName, dh der Wert wird in jeder Iteration überschrieben.