我想创建一组表现出以下行为的对象:
- 每个都有一个 BOOL 属性——称之为
dataLocked
——最初是错误的。 - 每个都有一组存储的属性,其值可以在任何时候设置,但不能读取
dataLocked == false
。 - 那些相同的存储属性可以在任何时候被读取,但不能被设置
dataLocked == true
dataLocked
只能设置一次。
下面是一个示例实现。是否有任何 Swifty 方法来实现这一点,而不必为每个对象的每个属性重现所有这些 get 和 set 条件?
我认为最巧妙的解决方案是创建一个属性包装器,但我还没有找到任何方法让包装器根据封闭对象中的“锁定”属性的值改变其行为。
class ImmutableObjectBase {
var dataLocked: Bool = false {
didSet { dataLocked = true }
}
private var _someIntValue: Int = 42
var someIntValue: Int {
get {
precondition(dataLocked, "Cannot access object properties until object is locked")
return _someIntValue
}
set {
precondition(!dataLocked, "Cannot modify object properties after object is locked")
_someIntValue = newValue
}
}
}
let i = ImmutableObjectBase()
i.someIntValue = 100
i.dataLocked = true // or false, it doesn't matter!
print (i.someIntValue) // 100
print (i.dataLocked) // true
i.someIntValue = 200 // aborts