2016-08-24 118 views
1

我有描述,需要測試了海水參數的協議:爲什麼我的默認屬性值在Init()中仍顯示爲參數?

​​

我有一個結構,Calcium,符合Parameter

struct Calcium: Parameter { 

    var name: String = "Calcium" 
    var unit: Unit = UnitDispersion.partsPerMillion 
    var value: Double 

} 

由於Calciumnameunit參數有默認值,爲什麼我需要在init方法中提供它們?我不應該只需要提供value的值?

我想了解面向協議的編程,真的很感謝這裏的一點指導。

enter image description here

回答

5
  1. 這有沒有任何關係與協議。

  2. 除了value之外,您不必提供任何初始化工具。但是你沒有提供任何初始值設定項。因此,唯一的初始化程序是自動提供的,初始化程序是成員初始化程序,它需要所有屬性的參數。

如果你不喜歡,寫一個初始化自己:

struct Calcium: Parameter { 
    var name: String = "Calcium" 
    var unit: Unit = UnitDispersion.partsPerMillion 
    var value: Double 
    init(value:Double) {self.value = value} 
} 

現在是合法的說:

let c = Calcium(value:2) 
+1

關於下一個明顯的問題:「爲什麼沒有按」 t Swift ...「,參見https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md,其中討論了改變這種行爲的兩種建議,並鏈接到了爲什麼它的理由迄今尚未改變。 –

+0

@RobNapier很酷,謝謝你的補充。所以我們可以稱之爲「智能成員初始值設定項」... :) – matt

+0

因此,如果我有,比方說20個更多符合參數協議的水參數結構,我仍然需要爲每個結構實現相同的初始化程序?這是可以添加到協議擴展中的東西嗎,還是我最好只是將該初始化程序添加到協議中,並要求它通過符合參數協議的所有內容來實現? –

相關問題