Swift3 无法为类型为[[String:Any]]的值下标类型为';字符串';-斯威夫特3
我正在转换Swift 3中的代码,我在线路上遇到以下错误:Swift3 无法为类型为[[String:Any]]的值下标类型为';字符串';-斯威夫特3,swift3,Swift3,我正在转换Swift 3中的代码,我在线路上遇到以下错误: let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]] let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first! 异常:无法为[[String:Any]]类型的值下标'String'类型的索引 请让我知道我哪里出
let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]]
let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first!
异常:无法为[[String:Any]]类型的值下标'String
'类型的索引
请让我知道我哪里出了问题,让我知道我如何解决同样的问题
在这一行中也会出现错误:
let user_id=String(((data as AnyObject).value(forKey: "UserLoginResult") as AnyObject).value(forKey: "UserID") as! Int)
Exception: Optional chain has no effect expression already produced Any?
不明白我哪里出了问题
错误3:
if(!((self.serviceProvided!.value(forKey: "Weekly")! as AnyObject).isKind(of: NSNull.self))){
let resultObject = self.serviceProvided!.value(forKey: "Weekly") as! NSDictionary
self.serviceProvicedListArray!.add(resultObject)
let resultObjectItems = self.serviceProvicedListArray!.value(forKey: "lstActType")
//print(resultObjectItems[0].count)
for i in 0..<resultObjectItems[0].count {
//for(var i=0; i<resultObjectItems[0].count; i += 1){
//let resultObjectItem = resultObjectItems[0][i] as! NSDictionary
let resultObjectItem = resultObjectItems[0][i] as AnyObject
self.serviceProvicedList!.add(resultObjectItem)
}
//print(self.serviceProvicedList)
self.serviceProvidedTableView.reloadData()
}
if(!((self.serviceProvided!.value(forKey:“Weekly”)!as AnyObject.isKind(of:NSNull.self))){
让resultObject=self.serviceProvided!.value(forKey:“Weekly”)作为!NSDictionary
self.serviceProviderListArray!.add(resultObject)
让resultObjectItems=self.serviceProviderListArray!.value(forKey:“lsactType”)
//打印(resultObjectItems[0]。计数)
对于0中的i.您的无序
是可选的,因此您需要使用?
(可选)或!
(强制)将其包装,然后在其上调用map
let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]]
let count = dicArray?.map({ Int($0["lstActType"] as? String ?? "0")! }).first!
击球手的方法是使用guard
或if let
包裹digarray
guard let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]] else {
print("Not array of dictionary")
return
}
guard let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first else {
return
}
print(count)
或者您可以在单个guard
语句中添加guard let
语句,如
guard let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]],
let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first else {
return
}
print(count)
编辑:您面临此问题的原因可能是因为您正在使用NSDictionary
和NSArray
,如果您使用swift的本机类型,您将很容易获取/访问值。您可以这样获取用户ID
guard let dict = data as? [String:Any],
let loginDict = dict["UserLoginResult"] as? [String:Any],
let userId = loginDict["UserID"] as? Int else {
return
}
let strUserId = String(userId)
if let resultObjectItems = self.serviceProvicedListArray!.value(forKey: "lstActType") as? [[[String:Any]]] {
for i in 0..<resultObjectItems[0].count {
let resultObjectItem = resultObjectItems[0][i] as AnyObject
self.serviceProvicedList!.add(resultObjectItem)
}
}
编辑:问题是您需要告诉编译器对象的类型resultObjectItems
array,所以请这样尝试
guard let dict = data as? [String:Any],
let loginDict = dict["UserLoginResult"] as? [String:Any],
let userId = loginDict["UserID"] as? Int else {
return
}
let strUserId = String(userId)
if let resultObjectItems = self.serviceProvicedListArray!.value(forKey: "lstActType") as? [[[String:Any]]] {
for i in 0..<resultObjectItems[0].count {
let resultObjectItem = resultObjectItems[0][i] as AnyObject
self.serviceProvicedList!.add(resultObjectItem)
}
}
如果让resultObjectItems=self.serviceProviderListArray!.value(forKey:“lstActType”)作为?[[String:Any]]{
对于0中的我..感谢您的及时回复!我已编辑了我的问题,并在另一行面对一个查询。您可以查看吗。?和建议感谢您的回复对我有效Swift 3语法在您开始时很混乱,如果有任何问题,将需要您的帮助help@RaghavChopra当然会帮助你,只要给我你的n的链接ew post(问题)。@RaghavChopra对于新问题,您需要添加新问题或编辑您的问题。@RaghavChopra检查编辑的答案。如果您有任何其他错误,您需要在此处添加新问题,而不是编辑此问题。