2017-07-24 132 views
-2

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

当我阅读下面的代码时,我对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实际上已经作为括号中的实现默认值。所以在这个类中不需要初始化方法。

在此先感谢。

+1

'randomizedSale'是一个*计算属性,*没有必要(也没有意义)“初始化”它。 –

回答

1

直接回答你的问题:初始化方法是没有必要的。

变量randomizedSale是静态的,所以你不需要一个实例来使用它。它与初始化无关。

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

class A { 
    var x: Int 
} 

,因为你的变量x是不可选的,所以你必须写一个初始化或者设置一个初始值,你没有提供任何值,你会得到一个错误。我们强烈建议您阅读section about initialization in Apple Docs

-2

你在这里正确的思路。所以基本上,如果DataGenerator的所有属性都有默认值,那么Swift可以给它一个默认初始值init()。所以DataGenerator确实有一个init,你只是不需要写它:)

1

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

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