无法在 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 中将日期转换为特定格式

无法在 Swift 中将 String 转换为 Double [重复]

无法在 Swift 2 中将 TableView @IBOutlet 连接到 ViewController

无法在 Swift 2 中将“__NSCFNumber”类型的值转换为“NSString”

无法在 Swift 中将“__NSSingleObjectArrayI”类型的值转换为“NSDictionary”