转换为Swift 4,下标不明确错误

转换为Swift 4,下标不明确错误,swift,Swift,我是swift的新手,目前在代码的突出部分遇到了问题,错误是下标的使用不明确。我尝试了在stackoverflow上可以找到的其他解决方案,但无法解决。请帮助我了解错误及其解决方法 do{ guard let jsonData = data else { throw MyError.FoundNil("JSON data issue!") } guard let dictionaryData = try? JSONSerialization.jsonObj

我是swift的新手,目前在代码的突出部分遇到了问题,错误是下标的使用不明确。我尝试了在stackoverflow上可以找到的其他解决方案,但无法解决。请帮助我了解错误及其解决方法

do{
    guard let jsonData = data else {
       throw MyError.FoundNil("JSON data issue!")
    }

    guard let dictionaryData = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [String:AnyObject] else {
        throw MyError.SerializationError("Unable to serialize")
    }

    guard let city = dictionaryData["city"]!["name"]!,
          // Error on next three lines
          let data1 = dictionaryData["list"]![0]! as? [String: AnyObject],
          let data2 = dictionaryData["list"]![1]! as? [String: AnyObject],
          let data3 = dictionaryData["list"]![2]! as? [String: AnyObject],
          let t1 = data1["t"] as? [String: AnyObject],
          let t2 = data2["t"] as? [String: AnyObject],
          let t3 = data3["t"] as? [String: AnyObject],
          let wDay1 = data1["w"]![0]! as? [String:AnyObject],
          let wDay2 = data2["w"]![0]! as? [String:AnyObject],
          let wDay3 = data3["w"]![0]! as? [String:AnyObject]
    else {
        throw MyError.DataPopulateError("Mismatch in assigning values from dictionary")
    }

首先,不要使用任何对象。将词典定义为
[字符串:任意]

接下来,问题是一旦您执行了类似于
dictionaryData[“some key”]
的操作,您现在就拥有了
Any
。这需要演员来做进一步的工作。该错误是由于尝试对
任何
使用数组索引访问而导致的

最后,您误用了
操作员。
guard let
的全部要点是安全地展开并安全地投射值。通过使用
,您可以克服这一点如果数据不是代码假定的数据,则会使应用程序崩溃

将第二个防护更新为:

guard let dictionaryData = try? JSONSerialization.jsonObject(with: jsonData, options: []) as! [String:Any] else {
    throw MyError.SerializationError("Unable to serialize")
}
然后重写你的大
guard
,如下所示:

guard let city = (dictionaryData["city"] as? [String:Any])?["name"] as? String,
    let list = dictionaryData["list"] as? [[String:Any]], list.count >= 3,
    let t1 = list[0]["t"] as? [String:Any],
    let t2 = list[1]["t"] as? [String:Any],
    let t3 = list[2]["t"] as? [String:Any],
    let wDay1 = (list[0]["w"] as? [[String:Any]])?.first,
    let wDay2 = (list[1]["w"] as? [[String:Any]])?.first,
    let wDay3 = (list[2]["w"] as? [[String:Any]])?.first
else {
    throw MyError.DataPopulateError("Mismatch in assigning values from dictionary")
}

非常感谢您的详细解释。你能告诉我为什么我们在把[“名称”]写为之前需要可选的(?)标记吗?guard语句中的字符串。guard let city=(dictionaryData[“city”]作为?[字符串:任意]?[“name”]作为?字符串。
[“name”]
之前的
称为“可选链接”。阅读Swift手册中的章节。