我正在阅读一本关于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。
出于兴趣,这是什么书?

10-08 05:55