为啥惰性变量/计算属性,而不仅仅是方法

Posted

技术标签:

【中文标题】为啥惰性变量/计算属性,而不仅仅是方法【英文标题】:Why lazy variables / computed properties, not just methods为什么惰性变量/计算属性,而不仅仅是方法 【发布时间】:2016-07-16 22:46:37 【问题描述】:

为什么 Swift 有“惰性变量”和“计算属性”的概念,而简单的 方法或函数 似乎适合此目的?

在computing Pi这种耗时的情况下,这不应该是一种方法吗?在this case 中也是如此。为什么要强制某些东西成为显然更复杂的变量/属性?

【问题讨论】:

见here。很相关…… 【参考方案1】:

答案:存在延迟变量以缩短加载时间(即出于优化原因)。除非明确要求,否则不需要立即使用某些变量。他们,比如Math.pi,可能需要一段时间来计算。因此,当最重要的用户启动操作完成时,应用程序可能会在后台线程中开始计算它们。

至于计算属性,我认为这更像是一种语言决定。 Objective-C 很久以前就引入了属性,它们在技术上一直是“计算的”(使用 getter 和 setter,无论是自动合成/显式实现),而且它是(并且 )广泛接受的功能。为什么?我不确定。也许这个问题没有“一个明确的答案”。就像我说的,我相信这是一个语言决定,而不是可以完全合理化的东西。

就我个人而言,使用相同的.property 语法而不是property()setProperty(_: Property) 函数来读取和写入属性感觉更直观。这是一种抽象,语言抽象是为了舒适/易用而存在的。您的示例非常做作,并且 Apple 框架中的数千个使用计算属性。并非每个计算属性都需要非常耗时,实际上它们中的大多数实际上是即时的;因此他们被抽象成这样。

当您考虑它时,一切都是从技术上计算出来的。例如,即使您将整数值直接设置为结构字段,也有一些事情需要在较小的范围内发生。这些低级计算被抽象为感觉就像是非计算的具体实体,而实际上它们是。这一切都归结为抽象。

【讨论】:

以上是关于为啥惰性变量/计算属性,而不仅仅是方法的主要内容,如果未能解决你的问题,请参考以下文章

类的惰性属性

为啥要在 vue.js 中计算属性?

为啥如果我得到计算对象中的对象属性未定义而不是对象本身?哪种方法更适合这种情况?

如何通过 Swift 中的闭包设置惰性计算属性的值?

快速更改计算属性

从属属性中的 MATLAB 惰性求值