ios - 无法将“__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)
}
请提供任何帮助!
解决方案
错误很明显:
无法将“__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)!
推荐阅读
- angular - Jasmine 抛出错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调
- c# - 如何在 Revit API 中捕获 Revit 错误?
- android - Seekbar 在 viewpager 内无法平滑滚动
- sql-server - 资源池默认系统内存不足,无法运行此查询
- dart - 消除原子钟 API 调用的延迟
- java - 如何使用休眠映射数据库表上的继承类?
- android - Android - 如何使用改造获得正常 http 调用的进度
- visual-studio-code - 如何在 vscode 扩展 webview 选项卡中将选项卡上的关闭图标 (x) 更改为圆圈?
- fortran - 简单阅读csv文件教程代码报错
- ethereum - 如何运行远程 wss/http geth 节点?