2016-08-25 60 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

相关问题