変化する
as! [[String:AnyObject]]
に
as? [[String:AnyObject]]
json データを (as!) 強制的にキャストしようとしているため、ガードを使用していても、nil の場合はその場所でクラッシュが発生します。
編集:あなたはまだ強制的だと言いました!そのため、コードをそのように分割してみてください。また、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
たぶん、各行のガードステートメントを別々に分割して、1つが失敗した場合にブロック全体が終了しないようにすることをお勧めします。その場合は、早期に終了したくないため 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
}
お役に立てれば。