Swift在结构中记忆缓存惰性变量

Swift在结构中记忆缓存惰性变量,第1张

概述我在 Swift中喝了struct / value koolaid.现在我有一个有趣的问题,我不知道如何解决.我有一个结构,它是一个容器,例如 struct Foo { var bars:[Bar]} 当我对此进行编辑时,我创建副本以便可以保留撤消堆栈.到现在为止还挺好.就像好的教程所示.我和这个人使用了一些派生属性: struct Foo { var bars:[Bar] 我在 Swift中喝了struct / value koolaID.现在我有一个有趣的问题,我不知道如何解决.我有一个结构,它是一个容器,例如

struct Foo {    var bars:[bar]}

当我对此进行编辑时,我创建副本以便可以保留撤消堆栈.到现在为止还挺好.就像好的教程所示.我和这个人使用了一些派生属性:

struct Foo {    var bars:[bar]    var derivedValue:Int {        ...    }}

在最近的分析中,我注意到a)计算derivedValue的计算是一种昂贵/冗余b)并不总是需要在各种用例中进行计算.

在我的经典OOP方式中,我会将其作为memoizing / lazy变量.基本上,在调用之前将其设置为nil,计算一次并存储它,并在将来的调用中返回所述结果.由于我正在遵循“make copy to edit”模式,因此不会破坏不变量.

但是,如果它是struct,我无法弄清楚如何应用这个模式.我可以做这个:

struct Foo {    var bars:[bar]    lazy var derivedValue:Int = self.computeDerivation()}

这是有效的,直到结构引用该值本身,例如

struct Foo {    var bars:[bar]    lazy var derivedValue:Int = self.computeDerivation()    fun anotherDerivedcomputation() {        return self.derivedValue / 2    }}

此时,编译器抱怨,因为anotherDerivedcomputation导致接收器更改,因此需要标记为变异.将访问者标记为变异只是感觉不对.但是对于笑容,我尝试了,但这会产生新的问题.现在,我有一个表达式的地方

XCTAssertEqaul(foo.anotherDerivedcomputation(),20)

编译器抱怨,因为参数隐式地是非变异let值,而不是var.

是否有一个模式我缺少一个带延迟/延迟/缓存成员的结构?

解决方法 记忆不会发生在结构内部.记忆的方法是在一些单独的空间中存储字典.关键是导出值的任何内容,值是值,计算一次.你可以使它成为struct类型的静态,就像命名空间一样.

struct S {    static var memo = [Int:Int]()    var i : Int    var square : Int {        if let result = S.memo[i] {return result}        print("calculating")        let newresult = i*i // pretend that's expensive        S.memo[i] = newresult        return newresult    }}var s = S(i:2)s.square // calculatings = S(i:2)s.square // [nothing]s = S(i:3)s.square // calculating
总结

以上是内存溢出为你收集整理的Swift在结构中记忆/缓存惰性变量全部内容,希望文章能够帮你解决Swift在结构中记忆/缓存惰性变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/999763.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存