2017-07-15 4 views
0

私はJSONデータを解析する構造体に取り組んでいます。そのデータはDark skyからです。私がそれに取り組んでいる間、何かが私の脳を打ち、それ以来それを熟考していました。指定された初期化子VSを静的メソッドを使用して構造体に代入する

伝統的に、私たちは指定されたイニシャライザを使用していましたが(オブジェクト指向のイニシャライザを無料で提供していますが)、オブジェクトをインスタンス化しています。しかし、それ自身を返す静的関数を簡単に使うことができ、その関数はプロパティに値を設定します。そのような

struct WeatherForecastData { 

    // Weather data 

    var apparentTemperature: Double? 
    var icon: String? 
    var precipProbability: Double? 
    var pressure: Double? 


    static func map(_ data: [String: AnyObject]) -> WeatherForecastData { 

     var p = WeatherForecastData() 

     p.apparentTemperature = data["apparentTemperature"] as? Double ?? nil 
     p.icon = data["icon"] as? String ?? nil 
     p.precipProbability = data["precipProbability"] as? Double ?? nil 
     p.pressure = data["pressure"] as? Double ?? nil 

     return p 
    } 
} 

予告静的メソッド、我々は指定イニシャライザでそれを置き換えるならば、それは静的メソッドと同じことをやっているでしょう。私の質問は、従来の指定されたイニシャライザの代わりにオブジェクトをインスタンス化するために静的メソッドを使うべきときです。

答えて

0

なぜこのようなカスタムイニシャライザを使用しないのですか?

struct WeatherForecastData { 

    var apparentTemperature: Double 

    var icon: String 

    var precipProbability: Double 

    var pressure: Double 

    init?(data:Dictionary<String,Any>) { 

     guard 

      let apparentTemperature = data["apparentTemperature"] as? Double, 

      let icon = data["icon"] as? String, 

      let precipProbability = data["precipProbability"] as? Double, 

      let pressure = data["pressure"] as? Double 

     else { 

      print("Invalid Data") 

      return nil 
     } 

     self.apparentTemperature = apparentTemperature 

     self.icon = icon 

     self.precipProbability = precipProbability 

     self.pressure = pressure 
    } 
} 
関連する問題