转换为Swift 4,模糊的下标错误

时间:2018-05-27 19:20:40

标签: swift

我是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")
    }

1 个答案:

答案 0 :(得分:1)

首先,不要使用AnyObject。将字典定义为[String: Any]

接下来,问题是,当您执行类似dictionaryData["some key"]的操作时,您现在拥有Any。需要投入其中以进行更深入的操作。错误来自尝试在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")
}