我使用weatherAPI进行某种JSON解析。为了防止我遇到nullPointer(可能页面处于离线状态或其他状态),我将解析覆盖成一个警卫,因为我认为他保护我解开可选值。
guard
let loadedWeather = (json["weather"] as! [[String:AnyObject]])[0]["description"] as? String,
let loadedTemperatur = (json["main"] as! [String:AnyObject])["temp"] as? Float,
let loadedWindSpeed = (json["wind"] as! [String:AnyObject])["speed"] as? Float
else {
print("Weather JSON-Parsing failed")
return
}
我误解了守卫的功能吗?如果是这样,我该如何解决这个问题呢?
实际上页面是离线的或者其他东西,并返回带有其他标签的错误JSON页面,所以“天气”,“主要”......等等。不包括。我希望在那种情况下,我的警卫会把我带到我的else
声明中,这样我才能处理这个案子。
非常感谢。
答案 0 :(得分:1)
您滥用保护语法 - 请按如下方式使用它:
guard let weatherArray = json["weather"] as? [[String:AnyObject]], let mainDict = json["main"] as? [String:AnyObject], let windDict = json["wind"] as? [String:AnyObject] else {
return
}
guard let dict = weatherArray.first else {
return
}
guard let description = dict["description"] as? String, let temp = mainDict["temp"] as? Float, let speed = windDict["speed"] as? Float else {
return
}
虽然我建议您遵循Damien所述的if let
语法。
答案 1 :(得分:0)
if let weather = json["weather"] {
// weather is define here, you can use it
}
答案 2 :(得分:0)
更改
as! [[String:AnyObject]]
到
as? [[String:AnyObject]]
你正试图强制施放你的json数据(如!),所以即使你使用后卫,如果它没有,你仍然会在该位置发生崩溃。
编辑:你说它还在逼迫!所以也许尝试分割你的代码。还应该使它更易读,更容易从json响应的dicts /数组中获取其他信息。这样的事情应该有效
/// Get json data
guard
let loadedWeather = json["weather"] as? [[String:AnyObject]],
let loadedTemperatur = json["main"] as? [String:AnyObject],
let loadedWindSpeed = json["wind"] as? [String:AnyObject]
else {
print("Weather JSON-Parsing failed")
return
}
/// Get info from json data
guard
let weatherDescription = loadedWeather[0]["description"] as? String,
let temperature = loadedTemperatur["temp"] as? Float,
let windSpeed = loadedWindSpeed["speed"] as? Float
else {
print("Weather JSON-Parsing failed")
return
}
/// do something with weather description, temperature, windSpeed
也许更好的尝试分别为每一行拆分那些守护语句,因此如果一个失败,你的整个块都不会退出。在那种情况下,如果让你更好,因为你不想提前退出。如果let语句,请不要启动任何厄运金字塔。
/// Weather
if let loadedWeather = json["weather"] as? [[String:AnyObject]],
let weatherDescription = loadedWeather[0]["description"] as? String {
// do something with weather description
}
/// Temperature
if let loadedTemperatur = json["main"] as? [String:AnyObject],
let temperature = loadedTemperatur["temp"] as? Float {
// do something with temperature
}
/// Wind speed
if let loadedWindSpeed = json["wind"] as? [String:AnyObject],
let windSpeed = loadedWindSpeed["speed"] as? Float {
// do something with windspeed
}
希望这有帮助。