2017-07-15 49 views
0

我一直在研究解析JSON数据的结构,该数据来自黑暗的天空。在我研究它的时候,有一件事触动了我的大脑,并一直在思考它。使用指定的初始化VS与静态方法来填充结构

传统上,我们一直在使用指定的初始值设定项(虽然struct为您提供了一个免费的成员智能初始值设定项)来实例化一个对象。但是,我们可以轻松使用一个返回自身的静态函数,并且该函数将填充属性。

像这样:

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