Swift类初始化混淆

时间:2017-07-24 15:01:17

标签: ios swift class initialization

我正在研究iOS类初始化中的类初始化。

当我阅读以下代码时,我对Swift初始化规则感到有些困惑。 这是代码:

struct Sale {
var month:String
var value:Double
}

class DataGenerator {

//Where is the initialization ?

static var randomizedSale: Double {
    return Double(arc4random_uniform(10000) + 1) / 10
}

static func data() -> [Sale] {
    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

    var sales = [Sale]()

    for month in months {
        let sale = Sale(month: month, value: randomizedSale)
        sales.append(sale)
    }

    return sales
}

我的问题是DataGenerator类中的初始化在哪里?

我在想的是,变量randomizedSale实际上已经将默认值作为括号中的实现。因此,此类中不需要初始化方法。

提前致谢。

3 个答案:

答案 0 :(得分:1)

直接回答您的问题:无需初始化方法。

变量randomizedSale是静态的,因此您不需要实例来使用它。它与初始化无关。

由于您的所有变量和函数都是静态的,因此您不需要编写init方法。如果创建类似:

class A { 
    var x: Int
}

您将收到错误,因为您的变量x不是可选的,并且您没有提供任何值,因此您必须编写init或设置初始值。

class A { 
    var x: Int // Write init or set a value here

    init() {
        x = 0
    }
}

我强烈建议您阅读section about initialization in Apple Docs

答案 1 :(得分:1)

DataGenerator类只有静态成员。必须始终为静态成员提供初始值(隐式或显式)。

没有实例变量的类不需要初始化。

答案 2 :(得分:-2)

你在这里思考正确的方向。所以基本上,如果DataGenerator的所有属性都有默认值,Swift可以为其提供init()的默认初始值。所以DataGenerator确实有一个init,你根本不需要写它:)