我需要一个 Swift 属性——如果该值尚未设置——默认为另一个值。
这可以使用后备存储私有属性来实现。例如,对于num
应该默认为 global的属性defaultNum
,它的工作方式如下:
var defaultNum = 1
class MyClass {
var num: Int {
get { _num ?? defaultNum }
set { _num = newValue }
}
private var _num: Int?
}
let c = MyClass()
print("initial \(c.num)") // == 1 ✅
// changing the default changes the value returned
defaultNum = 2
print("dynamic \(c.num)") // == 2 ✅
// once the property is set, returns the stored value
c.num = 5
print("base \(c.num)") // == 5 ✅
这行得通,但是对于我们代码中的一个常见模式,每个这样的属性都有很多样板文件。
使用 Swift 属性包装器,是否可以更简洁地做到这一点?
什么行不通_
请注意,因为我们希望默认值是动态的,所以静态初始化器将不起作用。例如:
var defaultNum = 1
class MyClass {
var num = defaultNum
}
var c = MyClass()
defaultNum = 2
print(c.num) // this == 1, we want the current value of defaultNum, which == 2