所以,我有这种情况,其中 var3
的值取决于 var1
和 var2
。基本上,这可以翻译成两种形式:
A) 对 var3 使用计算属性
class bla {
var var1: Int = 0
var var2: Int = 0
var var3: Int {
return var1 * var2
}
}
B) 使用存储属性和 var1 和 var2 的属性观察器
class bla {
var var1: Int = 0 {
didSet {
var3 = var1 * var2
}
}
var var2: Int = 0 {
didSet {
var3 = var1 * var2
}
}
var var3: Int = 0
}
但是,在我必须处理的情况下,变量都是在 UITableViewCell 中使用的巨大模型对象的所有部分。在这样的上下文中使用,它确实需要尽可能高效,这就是我试图避免在这种情况下使用计算属性的原因..原因据我所知,当 Swift 在 下获得 var3 的值时 A 类 实现时,它将即时计算其值,而不是像 B 类实现 那样将其缓存。正确的? (Swift 是否以任何方式缓存计算属性的值?)
现在我真的想知道应该采用什么最好的方法。事实上,我将其中一些变量迁移到模型对象中而不是在单元格内即时计算它们的全部要点是从单元格中卸下负载并尽可能平滑滚动,这说明使用计算属性使我的努力毫无意义。另一方面,我遇到过这样的情况,其中一个变量依赖于 3 到 4 个其他变量,这使得当这些值中的每一个发生变化时都需要重新计算它,我猜这也效率不高。
有什么建议吗?我做错了吗?
最佳答案
这是我目前使用的方法,其中需要在某个时刻计算实例属性并缓存以供后续访问:
class AClassWithCachedInstanceVariables {
private var _var1: Var1Type?
var var1: Var1Type {
if let var1 = self._var1 {
// cache hit
return var1
} else {
// cache miss
let var1 = self.getVar1()
self._var1 = var1
return var1
}
}
private var _var2: Var2Type?
var var2: Var2Type {
if let var2 = self._var2 {
// cache hit
return var2
} else {
// cache miss
let var2 = self.getVar2()
self._var2 = var2
return var2
}
}
/* Extra: let’s say we also want to require var1 and var2
to be recomputed whenever this other variable is changed */
var otherVar: OtherVarType? {
didSet(oldOtherVar) {
if otherVar != oldOtherVar {
self._var1 = nil
self._var2 = nil
}
}
}
private func getVar1() -> Var1Type {
// compute stuff...
return Var1Type()
}
private func getVar2() -> Var2Type {
// compute stuff...
return Var2Type()
}
}
关于ios - 来自 Performance Wise : Class Computed Property vs Stored Property,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34405420/