ios - 无法下标类型的值 - Swift 3

标签 ios swift

我是 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/

相关文章:

php - 快速登录 POST 连接 php

ios - 使用 2 个类/委托(delegate) Swift 从另一个单元格控制 UITableView 单元格的内容

ios - 我的应用程序默认有摄像头访问权限。我如何关闭它并请求权限?

ios - @escaping 闭包实际上在返回之前运行

arrays - 如何使用 swift 将自定义结构数组保存到 NSUserDefault?

ios - 是否有任何 Swift SIMD 浮点类型都符合的协议(protocol)?

ios - 保存数据以便稍后显示

ios - 如何使用 AFNetworking 允许 https 连接?

iOS如何在屏幕外启动图像并将其动画化到屏幕上

ios - 从 plist 中获取选定的 MapAnnotation 详细信息