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