2017-07-24 175 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類只有靜態成員。必須始終爲靜態成員提供初始值(隱式或顯式)。

沒有實例變量的類不需要初始化程序。