无法在 Swift 中将“__NSSingleObjectArrayI”类型的值转换为“NSDictionary”
Posted
技术标签:
【中文标题】无法在 Swift 中将“__NSSingleObjectArrayI”类型的值转换为“NSDictionary”【英文标题】:Could not cast value of type '__NSSingleObjectArrayI' to 'NSDictionary' in Swift 【发布时间】:2017-04-17 12:37:24 【问题描述】:当我解析 Api 时,我得到了响应并存储了对 Dictionary 的完整响应,然后我将它拆分为数组和字典,但是我得到了错误,所以请帮助解决错误,
这里我给出我尝试过的代码。
let responseDictionary:NSDictionary = responseObject as! NSDictionary
print(responseDictionary)
if let statusCode:NSNumber = responseDictionary.value(forKey: "success") as? NSNumber
if statusCode == 1
print("statusCode :",statusCode)
let incomingRequetArray:NSArray = responseDictionary.value(forKey: "incoming_requests") as! NSArray
print("incomingRequetArray",incomingRequetArray)
if (incomingRequetArray.count > 0)
let requestDataDict:NSDictionary = incomingRequetArray.value(forKey: "request_data") as! NSDictionary -----> Error in this line
print("requestDataDict",requestDataDict)
let ownerArray:NSArray = requestDataDict.value(forKey: "owner") as! NSArray
print("ownerArray",ownerArray)
self.mutDictOwner = ownerArray.object(at: 0) as! NSMutableDictionary
responseDictionary 是
"incoming_requests" = (
datetime = "2017-04-17 12:25:58";
later = 0;
"request_data" =
dog = (
);
owner =
address = "";
"d_latitude" = "0.00000000";
"d_longitude" = "0.00000000";
"dest_latitude" = "0.00000000";
"dest_longitude" = "0.00000000";
latitude = "11.01449160";
longitude = "76.98273220";
name = "Sss Sas";
"num_rating" = 0;
"payment_type" = 1;
phone = "+919123456789";
picture = "";
rating = "0.00";
;
"payment_mode" = 1;
;
"request_id" = 1474;
"request_services" = 30;
"time_left_to_respond" = 21;
);
"is_approved" = 1;
"is_approved_txt" = Approved;
"is_available" = 1;
success = 1;
【问题讨论】:
不要使用valueForKey
(在最广义上会导致错误),使用键下标。 不要使用NSArray / NSDictionary
,使用 Swift 原生集合类型。 不要在 Swift 中使用 NSMutable...
集合类型。 不要注释编译器可以推断的类型。
【参考方案1】:
你做错了
写这个
let requestDataDict:NSDictionary = incomingRequetArray[0]as!NSDictionary
let newDict: NSDictionary = requestDataDict.object(forKey: "request_data")
print("newDict is ---%@", newDict)
你使用了 NSDictionary 和 NSArray 格式所以我根据你的写了代码。但是为了在 swift 中进一步使用,不要使用 NSDictionary 和 NSArray。
【讨论】:
【参考方案2】:这是一个合理的 Swift 转录,它解决了错误。为方便起见,它使用类型别名。
typealias JSONDictionary = [String:Any]
let responseDictionary = responseObject as! JSONDictionary
print(responseDictionary)
if let success = responseDictionary["success"] as? Int, success == 1
print("statusCode :", success)
let incomingRequestArray = responseDictionary["incoming_requests" as! [JSONDictionary]
print("incomingRequetArray",incomingRequestArray)
if let requestDataDict = incomingRequestArray.first
print("requestDataDict",requestDataDict)
if let ownerArray = requestDataDict["owner"] as? [JSONDictionary], !ownerArray.isEmpty
print("ownerArray",ownerArray)
self.mutDictOwner = ownerArray[0] as! JSONDictionary
【讨论】:
【参考方案3】:在引发错误的行中,尝试将incomingRequetArray.value...
更改为incomingRequetArray[0].value...
,因为您需要访问包含在数组中的内部字典,然后查询给定键的值。
【讨论】:
谢谢它对我有帮助。【参考方案4】:这是因为你的“request_data”是一个对象而不是一个字典,看看“incoming_request”是如何开始的(用“(”)和“request_data”以“”开头。你可以做的是访问这个
let requestDataDict:NSDictionary = incomingRequetArray.value(forKey: "request_data") as! [AnyObject]-----> Error in this line
print("requestDataDict",requestDataDict)
let x = requestDataDict[0] as! NSDictionary
let ownerArray:NSArray = x.value(forKey: "owner")as! NSArray
【讨论】:
谢谢它对我有帮助。 我完全同意@Lalit jee 的观点,你不应该使用 NSDictionary 和 NSArray以上是关于无法在 Swift 中将“__NSSingleObjectArrayI”类型的值转换为“NSDictionary”的主要内容,如果未能解决你的问题,请参考以下文章
无法在getDocuments querysnapshot(Swift)中将变量分配给Firebase数据[重复]
无法在 Swift 中将 String 转换为 Double [重复]
无法在 Swift 2 中将 TableView @IBOutlet 连接到 ViewController