首页 > 解决方案 > 无法将“__NSSingleObjectArrayI”类型的值转换为“NSString”

问题描述

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

url https://example.com/index.php/?route=api/cart/addToCart参数 ["product_id": "12098", "option": "{\n\n}", "quantity": "0 ", "令牌": "2f42lqjie21cbzr1r0gsgphqtl", "宽度": "750.000000"] { 错误 = 1; message = ( "需要颜色!" ); 无法将类型“__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)
                        }

请提供任何帮助!

标签: iosswiftapiswift3nsstring

解决方案


错误很明显:

无法将“__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)!

推荐阅读