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