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」を抽出するにはどうすればよいですか?
どうもありがとう
オブジェクトがコード外で作成されていても、受け取るオブジェクトがNSMutableArray
であると想定するため、クラッシュが発生します。
この場合、コードが取得する配列は、単一の要素を処理するために最適化された配列のインスタンスです。それが、キャストが失敗する理由です。
この場合、オブジェクトの可変コピーを作成できます。
array = (dictionnary["data"]! as! NSArray).mutableCopy() as! NSMutableArray
そして
array = (responseObject as! NSArray).mutableCopy() as! NSMutableArray
Webサーバーからの応答を処理するとき、オブジェクトとタイプについて確認できません。したがって、必要に応じてオブジェクトをチェックして使用することをお勧めします。ご質問に関連する参考資料をご覧ください。
if let dictionnary : NSDictionary = responseObject as? NSDictionary {
if let newArr : NSArray = dictionnary.objectForKey("data") as? NSArray {
yourArray = NSMutableArray(array: newArr)
}
}
これにより、必要なオブジェクトのタイプをチェックするための純粋な条件付きであるため、アプリがクラッシュすることはありません。 「データ」キーが配列である場合、それだけが配列に進みます。ありがとう。