作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在阅读一本关于 Swift 设计模式的书,并遇到了一个示例,作者希望确保任何初始化特定类的子类的人都必须传入基类所需的值:
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
}
}
最佳答案
你是对的 - 如果没有 setter 和额外的处理逻辑,你从这种“支持变量”方法中获益甚微。这只是困惑。如果稍后你发现你想在类用户和实际存储的变量之间放置一些逻辑,你总是可以将它切换到一个计算属性(或者添加一个 willSet
/didSet
)。事实上,如果值在初始化后是不可变的,它应该用 let
而不是 var
来声明。这听起来像是来自 Java 或 C# 程序员的建议,将这些语言的实践应用于 Swift。
出于兴趣,这是什么书?
关于macos - 不寻常的 Swift Idiom - 它实现了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29043084/
我是一名优秀的程序员,十分优秀!