我是 Swift 的新手,正在尝试编写一个应用程序来解析网页中的 json。但是我收到了错误 “无法下标‘[Dictionary]’类型的值”
我该如何解决这个问题?它发生多次。以下是我的代码。谢谢!
func grabData(results: [Dictionary<String, Any?>]){
guard let resultList = results as? [Dictionary<String, Any?>] else { return }
for iResult in resultList {
var tempResult = SearchResult()
tempResult.studentId = self.getInt(dict: [iResult], string: "StudentId")
tempResult.LastName = self.getString(dict: [iResult], string: "LastName")
tempResult.FirstName = self.getString(dict: [iResult], string: "FirstName")
tempResult.Major = self.getString(dict: [iResult], string: "Major")
tempResult.Year = self.getString(dict: [iResult], string: "Year")
tempResult.GPA = self.getDouble(dict: [iResult], string: "GPA")
self.results.append(tempResult)
}
DispatchQueue.main.async {
self.listTableView.reloadData()
}
}
func getString(dict: [Dictionary<String, Any?>], string: String) -> String? {
if let result = dict[Dictionary<String, Any?>] as? String {
return result
}
return nil
}
func getInt(dict: [Dictionary<String, Any?>], string: String) -> Int? {
if let result = dict[string] as? Int {
return result
}
return nil
}
func getDouble(dict: [Dictionary<String, Any?>], string: String) -> Double? {
if let result = dict[string] as? Double {
return result
}
return nil
}
最佳答案
SearchResult.swift
struct SearchResult {
let studentID: Int
let lastName: String
let firstName: String
let major: String
let year: String
let gpa: Double
init?(json: [String:AnyObject]) {
guard let studentID = json["StudentID"] as? Int else {
return nil
}
guard let lastName = json["LastName"] as? String else {
return nil
}
guard let firstName = json["FirstName"] as? String else {
return nil
}
guard let major = json["Major"] as? String else {
return nil
}
guard let year = json["Year"] as? String else {
return nil
}
guard let gpa = json["GPA"] as? Double else {
return nil
}
self.studentID = studentID
self.lastName = lastName
self.firstName = firstName
self.major = major
self.year = year
self.gpa = gpa
}
}
ViewController.swift
func grabData(json: [String:AnyObject]) {
guard let searchResult = SearchResult(json) else {
return
}
self.results.append(searchResult)
DispatchQueue.main.async {
self.listTableView.reloadData()
}
}
这篇文章对我设计与 REST API 交互的模型很有帮助:https://developer.apple.com/swift/blog/?id=37
JSON 的结构也有所不同。
例如:
[
{
"StudentID": 12345,
"LastName": "Smith"
}
]
将表示为 [[String:AnyObject]]
(String 和 AnyObject 组合的数组)
如果你有这个,那么你需要循环遍历然后单独解析每个元素。
关于ios - 无法下标类型的值 - Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40662070/