Getter在Swift 3中的setter

时间:2017-02-04 09:09:25

标签: swift swift3

我正在使用此变量

public var tick: Int64 {
    get {
        return UserDefaults.standard.object(forKey: TICK) as? Int64 ?? 0
    }
    set(v) {
        let cur = UserDefaults.standard.object(forKey: TICK) as? Int64 ?? 0 + v
        UserDefaults.standard.set(cur, forKey: TICK)
    }
}

但我想知道,这是在内部设置器中调用getter的正确方法吗?我的意思是:

set(v) {
    let cur = /*HOW TO CALL GETTER HERE? */ + v
    UserDefaults.standard.set(cur, forKey: TICK)
}

如果我使用self代替/*HOW TO CALL GETTER HERE? */,它就无法运作。

2 个答案:

答案 0 :(得分:9)

您只需在其设置器中调用值(tick)即可获得旧值:

public var tick: Int64 {
    get {
        return UserDefaults.standard.object(forKey: TICK) as? Int64 ?? 0
    }
    set(v) {
        let cur = tick + v
        UserDefaults.standard.set(cur, forKey: TICK)
    }
}

答案 1 :(得分:2)

带有getter和setter的计算变量的标准实现如下:

private var stored: String

public var computed: String {
    get {
        return stored
    }
    set {
        stored = newValue
    }
}

setter定义中的名称newValue表示正在应用的值。

您可以将以下内容扔进游乐场,看看:

struct SomeStruct {
    private var stored: String = ""

    public var computed: String {
        get {
            return self.stored
        }
        set {
            self.stored = newValue
        }
    }
}

var value = SomeStruct()
print(value.computed)
value.computed = "new string"
print(value.computed)

如果你真的想在你的setter定义中引用getter,你可以。也许你只想根据getter的某种条件在setter中应用newValue

public var computed: String {
    get {
        return self.stored
    }
    set {
        self.stored = self.computed == "" ? self.computed : newValue
    }
}

这也是有效的,应该能够满足您的要求。