【问题标题】:Could not cast value of type '__NSSingleObjectArrayI' to 'NSString'无法将“__NSSingleObjectArrayI”类型的值转换为“NSString”
【发布时间】:2019-01-10 12:48:48
【问题描述】:

当 iOS 应用触发名为“addtocart”的 API 事件时,应用崩溃并返回以下错误。

网址https://example.com/index.php/?route=api/cart/addToCart参数 [“product_id”:“12098”,“选项”:“{\n\n}”,“数量”:“0”,“令牌”: “2f42lqjie21cbzr1r0gsgphqtl”,“宽度”:“750.000000”] { 错误 = 1; 消息 = ( “需要颜色!” );无法将类型“__NSSingleObjectArrayI”(0x1b5bee3b0)的值转换为“NSString”(0x1b5bfaad8)。 2018-08-02 19:50:28.493678+0300 Ishtari[35479:3846514] 无法转换的值 键入“__NSSingleObjectArrayI”(0x1b5bee3b0)到“NSString” (0x1b5bfaad8)。警告:无法执行要读取的支持代码 Objective-C 类中的数据过程。这可能会降低质量 可用的类型信息。 (lldb)

该产品具有称为颜色的选项,因此在添加到购物车之前,用户应该选择要结帐的商品的颜色。该应用程序返回选项名称“Color”,但没有给我选择的值(“option”:“{\n\n}”),这导致应用程序在调用HTTPApi时崩溃并给出上述错误。

   func callingHttppApi(){
        DispatchQueue.main.async{
            NetworkManager.sharedInstance.showLoader()
            let sessionId = self.defaults.object(forKey:"ic_token");
            let width = String(format:"%f", SCREEN_WIDTH * UIScreen.main.scale)
            self.view.isUserInteractionEnabled = false

            if self.whichApiToProcess == "addtocart"{
                var requstParams = [String:String]();
                requstParams["width"] = width
                requstParams["product_id"] = self.productId
                requstParams["ic_token"] = sessionId as? String
                requstParams["quantity"] = self.quantityValue.text
                do {
                    let jsonSortData =  try JSONSerialization.data(withJSONObject: self.optionDictionary, options: .prettyPrinted)
                    let jsonSortString:String = NSString(data: jsonSortData, encoding: String.Encoding.utf8.rawValue)! as String
                    requstParams["option"] = jsonSortString
                }
                catch {
                    print(error.localizedDescription)
                }


                NetworkManager.sharedInstance.callingHttpRequest(params:requstParams, apiname:"cart/addToCart", cuurentView: self){success,responseObject in
                    if success == 1{
                        let dict = responseObject as! NSDictionary;
                        NetworkManager.sharedInstance.dismissLoader()
                        if dict.object(forKey: "fault") != nil{
                            let fault = dict.object(forKey: "fault") as! Bool;
                            if fault == true{
                                self.loginRequest()
                            }
                        }else{
                            print(dict)
                            self.view.isUserInteractionEnabled = true
                            let dict = responseObject as! NSDictionary
                            if dict.object(forKey: "error") as! Int == 0{
                                NetworkManager.sharedInstance.showSuccessSnackBar(msg: dict.object(forKey: "message") as! String)
                                let data = dict.object(forKey: "total") as! String
                                self.tabBarController!.tabBar.items?[3].badgeValue = data.components(separatedBy: " ")[0]
                                self.navigationCart(cartCount:data.components(separatedBy: " ")[0])
                                if self.goToBagFlag == true{
                                    self.tabBarController!.selectedIndex = 3
                                }

                            }else{
                                NetworkManager.sharedInstance.showWarningSnackBar(msg: dict.object(forKey: "message") as! String)
                            }
                        }
                    }else if success == 2{
                        NetworkManager.sharedInstance.dismissLoader()
                        self.callingHttppApi()
                    }
                }
            }

当它崩溃时,控制台会将我引导到这一行

                        }else{
                            NetworkManager.sharedInstance.showWarningSnackBar(msg: dict.object(forKey: "message") as! String)
                        }

请帮忙!

【问题讨论】:

    标签: ios swift api swift3 nsstring


    【解决方案1】:

    错误很明显:

    无法将“__NSSingleObjectArrayI”(0x1b5bee3b0)类型的值转换为“NSString”(0x1b5bfaad8)

    左边是实际类型(Array),右边是你做错了什么(String

    NetworkManager.sharedInstance.showWarningSnackBar(msg: dict.object(forKey: "message") as! [String])
    

    如果 msg 应该是 String join 字符串

    let messageArray = dict.object(forKey: "message") as! [String] 
    NetworkManager.sharedInstance.showWarningSnackBar(msg: messageArray.joined(separator: ", "))
    

    顺便使用 Swift 原生类型和密钥订阅

    let dict = responseObject as! [String:Any]
    ...
    NetworkManager.sharedInstance.showWarningSnackBar(msg: dict["message"] as! [String])
    

    而且——抱歉——这种语法太可怕了:

    let jsonSortString:String = NSString(data: jsonSortData, encoding: String.Encoding.utf8.rawValue)! as String
    

    请替换为

    let jsonSortString = String(data: jsonSortData, encoding: .utf8)!
    

    【讨论】:

    • 谢谢你拯救了我的一天。然而,如果这与同一个问题有关,那么我会发布一个新问题。应用程序中没有填充选项,我可以看到选项类型,但看不到相关项目。
    • optionDictionary 显然是空的。请不要prettyPrint json。服务器不在乎漂亮。
    • 再次感谢,您指的是他的var optionDictionary = [String:AnyObject]() 我将检查来自API 或应用程序的空响应是否无法很好地检索它。对于prettyPrint,你建议停止它吗?
    • 我不确定这是否允许,但我在此处发布了一个关于从 NSArray 子数组中检索属性值的新问题 [stackoverflow.com/questions/51662511/…
    • 是的,.prettyPrinted 是供人类使用的,它会创建额外的空白字符。并且根本不要在 Swift 中使用 NS(Mutable 集合类型。你扔掉了强类型信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2016-06-06
    • 1970-01-01
    • 2021-10-02
    • 2017-09-26
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多