改变
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
也许更好地尝试分别为每一行拆分这些保护语句,以防万一失败,您的整个块不会退出。在这种情况下,最好使用 if let ,因为您不想提前退出。只是不要用 if 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
}
希望这可以帮助。