使用指定的初始化VS静态方法来填充结构

时间:2017-07-15 04:20:40

标签: swift class struct

我一直在研究解析JSON数据的结构,该数据来自Dark sky。当我正在研究它的时候,有些东西袭击了我的大脑并一直在思考它。

传统上,我们一直在使用指定的初始值设定项(尽管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
    }
}

注意静态方法,如果我们用指定的初始化器替换它,它将做与静态方法相同的事情。我的问题是我们何时应该使用静态方法来实例化一个对象而不是传统的指定初始化器?

1 个答案:

答案 0 :(得分: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
    }
}