Swift类初始化混淆
问题描述:
我正在研究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
实际上已经作为括号中的实现默认值。所以在这个类中不需要初始化方法。
在此先感谢。
答
直接回答你的问题:初始化方法是没有必要的。
变量randomizedSale
是静态的,所以你不需要一个实例来使用它。它与初始化无关。
由于所有变量和函数都是静态的,因此不需要编写init方法。如果建立这样的:
class A {
var x: Int
}
,因为你的变量x
是不可选的,所以你必须写一个初始化或者设置一个初始值,你没有提供任何值,你会得到一个错误。我们强烈建议您阅读section about initialization in Apple Docs。
答
你在这里正确的思路。所以基本上,如果DataGenerator
的所有属性都有默认值,那么Swift可以给它一个默认初始值init()
。所以DataGenerator确实有一个init
,你只是不需要写它:)
答
DataGenerator
类只有静态成员。必须始终为静态成员提供初始值(隐式或显式)。
没有实例变量的类不需要初始化程序。
'randomizedSale'是一个*计算属性,*没有必要(也没有意义)“初始化”它。 –