Swift 类型为'的值;NSArray.Element';(aka';Any';)没有下标
我在Xcode中打开了一个旧的ios项目,其中有关于swift 4更新的警告。 在修复错误的过程中,我找不到解决方案。 错误发生在循环jsonArray时,将值传递给变量Swift 类型为'的值;NSArray.Element';(aka';Any';)没有下标,swift,Swift,我在Xcode中打开了一个旧的ios项目,其中有关于swift 4更新的警告。 在修复错误的过程中,我找不到解决方案。 错误发生在循环jsonArray时,将值传递给变量 let url=NSURL(string:"http://webserver.com/json") let data = NSData(contentsOf: url! as URL) do { let jsonResult = try JSONSerialization.jsonObject
let url=NSURL(string:"http://webserver.com/json")
let data = NSData(contentsOf: url! as URL)
do {
let jsonResult = try JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
let jsonArray = jsonResult.value(forKey: "person") as! NSArray
for json in jsonArray {
let id = json["id"] as? Int?
let name = json["name"] as? String
let age = json["age"] as? String
tableID.append(String(id!))
tableName.append(name!)
tableAge.append(age!)
tableView.reloadData()
}
} catch {
}
代码中有很多不允许的地方
,NSURL
NSData
,NSArray
(导致错误的原因)NSDictionary
(NS)数据(内容)
值(forKey:)
.mutableContainers
- 忽略
块中的错误catch
let url = URL(string:"http://webserver.com/json")!
let task = URLSession.shared.dataTask(with: url) { [unowned self] (data, response, error) in
if let error = error { print(error); return }
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data!) as? [String:Any],
let jsonArray = jsonResult["person"] as? [[String:Any]] {
for json in jsonArray {
let id = json["id"] as! Int
let name = json["name"] as! String
let age = json["age"] as! String
self.tableID.append(String(id))
self.tableName.append(name)
self.tableAge.append(age)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
} catch {
print(error)
}
}
task.resume()
还有一个问题没有解决:不要将多个数组用作数据源 代码中有很多不允许的地方
,NSURL
NSData
,NSArray
(导致错误的原因)NSDictionary
(NS)数据(内容)
值(forKey:)
.mutableContainers
- 忽略
块中的错误catch
let url = URL(string:"http://webserver.com/json")!
let task = URLSession.shared.dataTask(with: url) { [unowned self] (data, response, error) in
if let error = error { print(error); return }
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data!) as? [String:Any],
let jsonArray = jsonResult["person"] as? [[String:Any]] {
for json in jsonArray {
let id = json["id"] as! Int
let name = json["name"] as! String
let age = json["age"] as! String
self.tableID.append(String(id))
self.tableName.append(name)
self.tableAge.append(age)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
} catch {
print(error)
}
}
task.resume()
还有一个问题没有解决:不要将多个数组用作数据源 如果我没记错的话,在过去,当
Foundation
被导入到支持objective C的平台上时,Swift对Any
进行了特殊处理。它将支持向其发送任何消息,即使任何特定值Any
可能不会响应您试图发送的消息。该功能最终被删除。虽然便于ObjC互操作,但它是隐式的,并且(在编译时)容易出错。如果我没记错的话,在过去,当Foundation
导入到支持objective C的平台上时,Swift对Any
进行了特殊处理。它支持向它发送任何消息,即使任何特定值any
可能不会响应您试图发送的消息。该功能最终被删除。虽然ObjC互操作很方便,但它是隐式的,并且(在编译时)容易出错。更好的是:使用codable。@Alexander RestoreMonica确实如此,但我不想过度训练OP。更好的是:使用codable。@Alexander RestoreMonica确实如此,但我不想过度训练OP