2017-02-08 22 views
2

「fds」のようなランダムな文字列を除いて、すべてがうまく動作しますが、この種のエラーから保護するためにガードを正しく、効率的に使用するにはどうすればよいですか?InitでGuardを使用していますか?

enter image description here

init(weatherData: [String: AnyObject]) { 
    city = weatherData["name"] as! String 

    let weatherDict = weatherData["weather"]![0] as! [String: AnyObject] 
    description = weatherDict["description"] as! String 
    icon = weatherDict["icon"] as! String 

    let mainDict = weatherData["main"] as! [String: AnyObject] 
    currentTemp = mainDict["temp"] as! Double 
    humidity = mainDict["humidity"] as! Int 

    let windDict = weatherData["wind"] as! [String: AnyObject] 
    windSpeed = windDict["speed"] as! Double 
} 

答えて

8

どのように私は正確かつ効率的にエラーのこの種から保護するためのガードを使用しますか?

なぜしたいですか?呼び出し元が"name"キーが存在し、文字列である辞書を手渡さない場合、cityを初期化できないため、あなたは死んでいます。 がクラッシュするようにします。

あなたは辞書が必要なデータが含まれていない場合、このfailable初期化子作り、(リターンnilを)失敗した後、実際にクラッシュすることなく、このような状況から脱出したい場合。結果は、nilの可能性のあるOptionalになり、呼び出し元がそれをチェックする必要があるため、呼び出し元にクラッシュする危険性が効果的に押されます。私はだろう

init?(weatherData: [String: AnyObject]) { 
    guard let city = weatherData["name"] as? String else {return nil} 
    self.city = city 
    // ... and so on ... 
} 

しかし、何はそれらのもののいずれでもありません。私は初期化子をinit(city:description:icon:currentTemp:humidity:windSpeed:)と書き直し、呼び出し元に辞書を必要なデータにパースさせるように強制します。そうすれば、データがそこになければ、最初にこのクラスを初期化しようとすることさえありません。私の主張は、辞書を解析するのは呼び出し元の仕事だということです。 このクラスは、インターネット(またはソースが何であれ)から引き出された複雑な辞書の構造についての知識がありません。

+1

私はあなたの元の答えが好きではありませんでした - 不必要なクラッシュ - しかし、イニシャライザを作成することに完全に同意します。上院議員。 – dfd

+1

驚くばかり!ありがとう@マット – Casey

関連する問題