【问题标题】:Type '[String:Any]' has no subscript members in Swift类型 '[String:Any]' 在 Swift 中没有下标成员
【发布时间】:2017-07-15 06:51:10
【问题描述】:

我正在尝试从 json 结果中获取信息并附加和访问某些键值。但是,我收到错误“类型'[String:Any]'没有下标成员。

        let json = try? JSONSerialization.jsonObject(with: data!, options: []) as! [String: Any]
        for case let studentsInfo in json["results"] {
            if let studentInfo = StudentResults(json: result) {
                let name = firstName + " " + lastName
                StudentsResults.append(name)
            }

这也是我放在扩展中的结构。

struct StudentResults{
    let firstName: String
    let lastName: String
    let latitude: Double
    let longitude: Double
    let mapString:String
    let mediaURL: String
    let objectID:String
    let uniqueKey: String
    let updatedAt: String
}

convenience init?(json: [String: Any]) {
    guard let firstName = json["firstName"] as? String,
          let lastName = json["lastName"] as? String
        else {
            return nil
    }
    return nil

如果你想看看的话,这也是我这个项目的 GitHub 页面

https://github.com/SteveBurgos95/UdacityMapProject

【问题讨论】:

    标签: json swift networking struct


    【解决方案1】:

    在我看来问题出在这行代码上:

    let json = try? JSONSerialization.jsonObject(with: data!, options: []) as! [String: Any]

    虽然您在此处强制转换为 as! [String: Any],但 try? 为您提供了一个可选值。

    你有两个选择。你可以是个疯子,把try?改成try!,或者你可以采取更安全的方法,像这样包装代码:

    do {
        guard let json = try JSONSerialization.jsonObject(with: data!, options: []) as [String: Any] else { return }
        …
    } catch {
        // HANDLE ERROR
    }
    

    【讨论】:

    • 我试过这样做,但是,我收到一条错误消息,提示“条件绑定的初始化程序必须具有可选类型,而不是 '[String:Any]'”如果我将其更改为可选然后我有泰伊吗?不符合协议顺序。 @InfinityJames
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多