我正在使用此变量
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? */
,它就无法运作。
答案 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
}
}
这也是有效的,应该能够满足您的要求。