我的代码看起来有点像:
协定
protocol MyProtocol: class {
var featureConfigs: [String: Any]? { get set }
}
基类
class MyBaseClass: MyProtocol {
var featureConfigs: [String : Any]? {
get {
return nil
}
set {
self.featureConfigs = newValue
}
}
}
子类
class MySubclass: MyBaseClass {
override var featureConfigs: [String : Any]? {
get {
return ["feature-specific-configuration":""]
}
set {
self.featureConfigs = newValue
}
}
}
我希望能够更新featuresConfig
中存储的值。我知道做self.featureConfigs = newValue
导致无限循环,但我不确定如何正确更新featuresConfig
字典。我已经阅读了Subscript
并尝试了一些事情,但我也无法做到这一点。有什么建议吗?
答案 0 :(得分:3)
为了能够为featureConfigs
设置持久值,它必须是存储的属性,而不是计算的属性(这也可以是您为此任务创建的私有后备变量,作为@AMomchilov says)。然后,您可以使用willSet
或didSet
来观察更改。
在您的子类中,您可以使用计算的属性覆盖存储的属性声明,以便在访问时使用super
按顺序更新字典中的给定值 - 密钥对引用超类的存储属性。
例如:
protocol MyProtocol: class {
var featureConfigs: [String: Any]? { get set }
}
class MyBaseClass: MyProtocol {
var featureConfigs: [String : Any]? { // stored property with setter observers
willSet {
print("about to be set")
}
didSet {
print("was set")
}
}
}
class MySubclass: MyBaseClass {
// calculated property that forwards to super's stored property
override var featureConfigs: [String : Any]? {
get {
// injects the updated value of a given key when accessing
guard var config = super.featureConfigs else {return nil}
config["feature-specific-configuration"] = "baz"
return config
}
set {
super.featureConfigs = newValue
}
}
}
的
let s = MySubclass()
s.featureConfigs = ["foo":"bar"]
print(s.featureConfigs) // Optional(["feature-specific-configuration": "baz", "foo": "bar"])
答案 1 :(得分:1)
你写的是computed property。与stored properties不同,它不受持久性实例变量的支持。
您可以手动创建私有实例变量来支持此伪计算属性的存储。然后,您可以为此变量提供特定于其所属子类的默认值。