2016-08-24 117 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个更多符合参数协议的水参数结构,我仍然需要为每个结构实现相同的初始化程序?这是可以添加到协议扩展中的东西吗,还是我最好只是将该初始化程序添加到协议中,并要求它通过符合参数协议的所有内容来实现? –

相关问题