0

私は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 ページを返すため、「weather」、「main」などです。含まれていない。その場合、警備員が私を私のelse声明の中に連れてきて、そのケースを処理できることを願っていました.

どうもありがとう。

4

3 に答える 3

0

条件付きアンラップを探す必要があります: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

if let weather = json["weather"] {
// weather is define here, you can use it
}
于 2016-10-03T09:49:51.470 に答える
0

変化する

 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
}

お役に立てれば。

于 2016-10-03T09:54:07.980 に答える