Swift Dictionary - 更新setter函数中的值

时间:2016-06-06 15:42:01

标签: swift dictionary

我的代码看起来有点像:

协定

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并尝试了一些事情,但我也无法做到这一点。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

为了能够为featureConfigs设置持久值,它必须是存储的属性,而不是计算的属性(这也可以是您为此任务创建的私有后备变量,作为@AMomchilov says)。然后,您可以使用willSetdidSet来观察更改。

在您的子类中,您可以使用计算的属性覆盖存储的属性声明,以便在访问时使用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不同,它不受持久性实例变量的支持。

您可以手动创建私有实例变量来支持此伪计算属性的存储。然后,您可以为此变量提供特定于其所属子类的默认值。