为什么警卫不能保护我免受我
问题描述:
我做了某种JSON解析weatherAPI。为了防止我陷入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
声明中,以便我可以处理这种情况。
非常感谢。
答
if let weather = json["weather"] {
// weather is define here, you can use it
}
答
你滥用了后卫的语法 - 使用它,如下所示:
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
}
虽然我会建议您按照if let
语法概述由达米恩。
答
变化
as! [[String:AnyObject]]
到
as? [[String:AnyObject]]
您正在试图迫使投你的JSON数据(!),所以即使你使用的守护你还是会在该点,如果得到一个崩溃其零。
编辑:你说它仍然强迫!所以也许尝试像这样分解你的代码。还应该让它更易读,更容易从json响应的字典/数组中获取其他信息。像这样的东西应该工作
/// 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
甚至更好的尝试单独分割每行的后卫语句,使柜面一个失败,你的整个块不会退出。在那种情况下,如果因为不想早点退出而更好使用。如果发表声明,就不要启动厄运的任何金字塔。
/// 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
}
希望这会有所帮助。
Swift编译器迫使我做! – kuemme01
构建失败与as? – kuemme01
你应该尝试分解你的代码,而不是做这个大规模的声明。让我更新我的答案,给我几分钟。 – crashoverride777