无法将类型为 NSSingleObjectArray 的值转换为 NSMutableArray

11

iOS10以来,我一直面临着这个问题:

无法将类型 '__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中提取值"Test"?

非常感谢。


3
像往常一样,在Swift中不要使用可变的Foundation集合类型。这样做的危害比(表面上的)好处更大。 - vadian
2个回答

22

崩溃发生是因为您假设接收到的对象是NSMutableArray,即使该对象已在您的代码外部创建。

在这种情况下,您的代码获得的数组是专为处理单个元素优化的数组实例;这就是为什么转换失败的原因。

当出现这种情况时,您可以制作可变副本:

当出现这种情况时,您可以制作可变副本:

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

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

8

当我们处理来自Web服务器的响应时,无法确定对象和类型。因此,最好根据我们的需要检查和使用对象。请参考相关问题。

if let dictionnary : NSDictionary = responseObject as? NSDictionary {

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

             yourArray = NSMutableArray(array: newArr)
      }

}

通过这个方法,您的应用程序将永远不会崩溃,因为它是纯粹的有条件的,可以检查所需对象的类型。如果您的“data”键是数组,则只会处理您的数组。谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接