我正在编写一本关于Swift设计模式的书,并且遇到了一个例子,作者希望确保任何初始化特定类的子类的人都必须传入基类所需的值: / p>
class Employee {
private var professionBV: String // BV = backingVariable
private init(profession: String) {
self.professionBV = profession
}
final var profession: String {
return professionBV
}
}
// Even if you create your own init here, you always have to pass in a
// value for profession
class Nurse: Employee { }
我不明白的是作者通过将支持变量与计算属性结合使用而获得的。它不等于这个:
// Remove the backing variable, mark profession as final - what have I lost?
class Employee {
final private var profession: String
private init(profession: String) {
self.profession = profession
}
}
答案 0 :(得分:5)
你是对的 - 如果没有setter,也没有额外的处理逻辑,你从这种“支持变量”方法中获得的收益很少。这只是杂乱无章。如果稍后您确实发现要在类用户和实际存储变量之间放置一些逻辑,则可以始终将其切换为计算属性(或添加willSet
/ didSet
)。实际上,如果值在初始化后是不可变的,则应使用let
而不是var
来声明它。这听起来像是来自Java或C#程序员的建议,将这些语言的实践应用于Swift。
出于兴趣,这是什么书?
答案 1 :(得分:2)
第一个示例使专业变量可用于随处读取 - 只有写访问(通过支持变量)仅限于定义Employee类的同一文件。第二个例子也阻止它从其他文件中读取。
但到目前为止,实现这一目标的可能性更大 - 您可以为setter配置不同的访问修饰符:
class Employee {
private(set) final var profession : String
}
这使getter具有默认权限,但需要setter的相同文件。