2016-08-25 59 views
2

我有一個協議叫做Parameter有沒有辦法隱藏Swift Struct的默認初始化程序?

protocol Parameter { 

    var name: String { get } 
    var unit: Unit? { get } 
    var value: Double { get } 

    init(name: String, unit: Unit?, value: Double) 

} 

我也有16層結構符合Parameter

struct Calcium: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Calcium", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Alkalinity: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Alkalinity", unit: Unit? = Unit(symbol: "ppm CaCO3"), value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Salinity: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Salinity", unit: Unit? = Unit(symbol: "SG"), value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Temperature: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Temperature", unit: Unit? = UnitTemperature.fahrenheit, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct PH: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "pH", unit: Unit? = nil, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Magnesium: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Magnesium", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Phosphate: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Phosphate", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Ammonia: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Ammonia", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Silica: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Silica", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Iodine: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Iodine", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Nitrate: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Nitrate", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Nitrite: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Nitrite", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Strontium: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Strontium", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct ORP: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "ORP", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Boron: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Boron", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

    struct Iron: Parameter { 

     var name: String 
     var unit: Unit? 
     var value: Double 

     init(name: String = "Iron", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
      self.name = name 
      self.unit = unit 
      self.value = value 
     } 

    } 

正如你所看到的,所有的結構都實現了相同的初始化。

let calcium = Calcium(value: Double) 

我還可以得到由結構創建的默認初始值:

let calcium = Calcium(name: String, unit: Unit?, value: Double) 
在初始化,我有兩個由 Parameter協議,這給了我下面的初始化需要三個參數提供默認值

當我創建結構體的實例時,兩個初始化符都出現在Xcode的代碼完成彈出窗口中。但是,我不希望nameunit參數能夠與初始值設定項中提供的默認值不同。我還嘗試爲nameunit屬性指定默認值,其中它們在結構中聲明,但在Parameter協議所需的初始化程序之外聲明。

有沒有辦法通過爲nameunit參數提供默認值,只需要要提供的value參數,而不必在Xcode的代碼完成彈出默認初始化顯示初始化結構?

在Xcode的代碼完成彈出窗口中出現的兩個初始值設定項唯一的問題是,我不希望別人創建結構並提供值,而不是我在Parameter協議所要求的初始值設定項中提供的值。

我意識到我可以通過一個類來實現,但我試圖通過面向協議的編程和使用結構來實現我的想法。

回答

0

一種方式做到這一點:

我們改變了所有變量自選,並刪除與協議缺省參數初始化。如果unitvalue將具有默認值總是,則客戶端無需查看此初始值設定項。

protocol Parameter { 
    var name: String? { get } 
    var unit: Unit? { get } 
    var value: Double? { get } 
    //init(name: String, unit: Unit?, value: Double) 
    init(value: Double) 
} 

而改變結構,看起來像這樣:

struct Calcium: Parameter { 

    var name: String? = nil 
    var unit: Unit? = nil 
    var value: Double? = nil 

    init(value: Double) { 
     self.init(name: "Calcium", unit: UnitDispersion.partsPerMillion, value: value) 
    } 

    private init(name: String, unit: Unit, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

在結構本身,我們已經增加了私人初始化,這是從自定義的初始要求只有一個參數調用。

而且在Xcode完成彈出窗口中只有一個初始值設定項。 image

相關問題