不寻常的斯威夫特成语 - 它实现了什么?

Pau*_*son 3 macos cocoa idioms swift

我正在编写一本关于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 { }
Run Code Online (Sandbox Code Playgroud)

我不明白的是作者通过使用支持变量和计算属性获得的.这不等于这个:

// 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
    }
}
Run Code Online (Sandbox Code Playgroud)

Air*_*ity 5

你是对的 - 如果没有setter,也没有额外的处理逻辑,你从这种"支持变量"方法中获得的收益很少.这只是杂乱无章.如果稍后您确实发现要在类用户和实际存储变量之间放置一些逻辑,则可以始终将其切换为计算属性(或添加willSet/ didSet).实际上,如果在初始化之后该值是不可变的,则应该声明它let不是var.这听起来像是来自Java或C#程序员的建议,将这些语言的实践应用于Swift.

出于兴趣,这本书是什么?