2016-09-27 17 views
9

由於iOS10,我面臨這個問題:無法投類型NSSingleObjectArray的價值NSMutableArray中

無法投型「__NSSingleObjectArrayI」的價值 「的NSMutableArray」。

有我的代碼:

manage.POST(url, parameters: params, 
        constructingBodyWithBlock: { (data: AFMultipartFormData!) in 
         //Some stuff here 
      }, 
        success: { (operation: NSURLSessionDataTask?, responseObject: AnyObject?) in 

         var array : NSMutableArray! 

         if AppConfig.sharedInstance().OCR == "2"{ 
          let dictionnary = responseObject as! NSDictionary 
          array = dictionnary["data"]! as! NSMutableArray 
         }else{ 
          //!!!!CRASH HERE!!!!!  
          array = responseObject as! NSMutableArray 
         } 
         //Some stuff after 
} 

當我尋找responseObject價值,我有這個在我的控制檯:

Printing description of responseObject: 
▿ Optional<AnyObject> 
    ▿ Some : 1 elements 
    - [0] : Test  

我怎樣才能獲取價值從responseObject 「測試」?

非常感謝

+3

一如既往,不要在Swift中使用可變的Foundation集合類型。傷害比(明顯的)好處更大。 – vadian

回答

13

的崩潰是因爲你認爲你收到的對象是NSMutableArray,即使對象已經被你的代碼之外創建的。

在這種情況下,您的代碼獲取的數組是一個數組的實例,該數組針對處理單個元素進行了優化;這就是演員陣容不成功的原因。

發生這種情況時,可以使對象的可變副本:

array = (dictionnary["data"]! as! NSArray).mutableCopy() as! NSMutableArray 

array = (responseObject as! NSArray).mutableCopy() as! NSMutableArray 
6

當我們處理來自Web服務器響應,那麼我們可以不知道對象和類型。所以最好根據我們的需要來檢查和使用對象。請參閱有關您的問題的參考。

if let dictionnary : NSDictionary = responseObject as? NSDictionary { 

    if let newArr : NSArray = dictionnary.objectForKey("data") as? NSArray { 

      yourArray = NSMutableArray(array: newArr) 
     } 

} 

通過這個你的應用程序將永遠不會墜毀,因爲它是純粹的有條件的需要檢查類型的對象。如果你的「數據」鍵是數組,那麼只有它會繼續進行數組。謝謝。

相關問題