web-dev-qa-db-ja.com

NSSingleObjectArray型の値をNSMutableArrayにキャストできませんでした

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」を抽出するにはどうすればよいですか?

どうもありがとう

10
Kevin ABRIOUX

オブジェクトがコード外で作成されていても、受け取るオブジェクトがNSMutableArrayであると想定するため、クラッシュが発生します。

この場合、コードが取得する配列は、単一の要素を処理するために最適化された配列のインスタンスです。それが、キャストが失敗する理由です。

この場合、オブジェクトの可変コピーを作成できます。

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

そして

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

Webサーバーからの応答を処理するとき、オブジェクトとタイプについて確認できません。したがって、必要に応じてオブジェクトをチェックして使用することをお勧めします。ご質問に関連する参考資料をご覧ください。

if let dictionnary : NSDictionary = responseObject as? NSDictionary {

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

             yourArray = NSMutableArray(array: newArr)
      }

}

これにより、必要なオブジェクトのタイプをチェックするための純粋な条件付きであるため、アプリがクラッシュすることはありません。 「データ」キーが配列である場合、それだけが配列に進みます。ありがとう。

8
Max