ios - 来自 Performance Wise : Class Computed Property vs Stored Property

标签 ios swift class-design

所以,我有这种情况,其中 var3 的值取决于 var1var2。基本上,这可以转化为两种形式:

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/

相关文章:

asp.net - 隐含某种实现的接口(interface)有什么好处?

.net - 在.NET中,为什么我可以访问类中类实例的私有(private)成员?

ios - 在 iOS 的 TableView 单元格中显示 Collection View 的问题

ios - NSMutableArray 总是用最后一个替换旧对象

ios - 将 nil 传递给具有泛型类型约束的可选参数的编译错误

iphone - UIImagePickerController 中的音量控制

ios - 如何使用 Swift 绘制 720 个数据点

ios - Swift 3 iMessage 扩展不打开 URL

c# - 使用公共(public)成员有什么好处/坏处/不必要的吗?

ios - Stripe 模块的解析返回错误