【问题标题】:Could not cast value of type '__NSSingleObjectArrayI' to 'NSDictionary' in Swift无法在 Swift 中将“__NSSingleObjectArrayI”类型的值转换为“NSDictionary”
【发布时间】: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... 集合类型。 不要注释编译器可以推断的类型。

标签: ios swift nsdictionary


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 2017-07-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2016-02-01
      相关资源
      最近更新 更多