无法下标类型的值[字符串:任何]类型的“字符串”的指数 - 斯威夫特3
问题描述:
我将我的代码在斯威夫特3和我收到就行了这个错误:无法下标类型的值[字符串:任何]类型的“字符串”的指数 - 斯威夫特3
let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]]
let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first!
例外:Cannot subscript a value of type [[String:Any]] with an index of type '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()
}
感谢。
答
你的dicArray
是可选的,所以你需要用?
(可选)或!
(强制)包装它,然后调用它的地图。
let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]]
let count = dicArray?.map({ Int($0["lstActType"] as? String ?? "0")! }).first!
面糊的方法是使用guard
或if let
和包裹dicArray
。
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的原生型将是大量容易让你得到/访问值。您可以像这样获得UserID
。
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)
编辑:问题是你需要告诉编译对象resultObjectItems
阵列具有的类型,所以尝试这样的方式。
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)
}
}
赞赏您的快速反应!,我编辑了我的问题,并面对其他线上的查询以及您可以看看它。 ?并建议 –
@RaghavChopra检查编辑的答案为 –
感谢您的反应,它为我工作斯威夫特3语法令人困惑,当你开始时,需要你的帮助,如果有任何帮助 –