2016-10-03 4 views
0

気象APIを使用して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の声明の中に私を連れて来ることを願っています。

ありがとうございます。

答えて

0

あなたは条件付きアンラップを探す必要があります: - :概説として

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構文に従うことをお勧めしますでしょうけれども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 
} 
1

あなたはガードの構文を悪用しているが、次のようにそれを使用しますダミアン。

as? [[String:AnyObject]] 

0

変更

as! [[String:AnyObject]] 

あなたはJSONデータをキャストに強制しようとしている(と!)ので、あなたはガードを使用しているにもかかわらず、場合あなたはまだその場所でクラッシュを取得しますその無し。

編集:あなたはまだ強制的に言った!そのようにあなたのコードを分割しようとするかもしれません。また、jsonレスポンスのdicts/arraysから他の情報を取得するのがより読みやすく、簡単になるはずです。このような何かは1つがあなたの全体のブロックが終了しない障害が発生した包みので、個別に各ラインのために、これらのガード文を分割しようとするより良いかもしれない

/// 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を使う方がよいでしょう。 if文を使用すると、運命のピラミッドを開始してはいけません。

/// 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 
} 

これが役に立ちます。

+0

スウィフトコンパイラは私としてやっています! – kuemme01

+0

ビルドに失敗しましたか? – kuemme01

+0

この大量のステートメントを実行する代わりに、コードを分割してください。私の答えを更新してみましょう、私に数分を与えてください。 – crashoverride777

関連する問題