在比较这两个用于定义实例属性的选项时:
var networkManager = NetworkManager.sharedInstance() 变量惰性networkManager = NetworkManager.sharedInstance()
两者均:
懒惰:
不懒惰的:
似乎永远使用非惰性变量没有好处。那么,为什么语言允许程序员做出这种劣等的选择呢?
(我不是在问var和letàla Swift常量默认是懒惰的吗?之间的区别)
发布于 2016-01-17 18:23:59
一个原因可能是,当评估发生时,懒散并不适合于你想要控制的情况。在分配中所做的工作有副作用的情况下,这是相关的。
虽然这与封闭有关,但斯图尔特塞拉的博客帖子很好地解释了这个想法,我认为它同样适用于任何语言。
发布于 2016-01-17 22:28:39
正如其他人已经说过的,有几种关键的场景,您希望属性的初始化是deterministic.。
这是一个与游戏开发相关的示例(以及其他许多例子)。
通常,表示游戏场景/级别中项的类的实例是在开始级别的之前创建的。
初始化可能是一项耗费时间的任务(从持久存储加载内存、分配内存、准备实例.)并且在玩家开始播放这个级别之前完成这个部分,可以避免CPU开销。
这一点至关重要,因为一个级别中间的CPU开销可能会导致帧速率下降,这对用户体验来说是一场噩梦。
发布于 2016-01-18 02:26:30
仅供参考。我的感觉是斯威夫特想要变得更像一种功能语言,并希望在更多的地方懒惰实例化。
随着时间的推移,斯威夫特的早期评估表现得相当不错(嗯,“非功能性”部分)。在以后的版本中,我没有预料到Swift会比函数更倾向于方法)。Swift不是一种功能语言,也不打算成为一种语言。这经常出现在WWDC的谈话,论坛上,推特上,和Swift团队的谈话中。最初,所有的地图和过滤器都是懒惰的。斯威夫特把它去掉了,因为它造成了一些问题。在这个问题上最好的话题可能是“用Swift构建更好的价值类型应用程序”。正如他们所说:
我们喜欢突变。我们认为它很值钱。我们认为,正确地使用它是容易的。
你不会得到比这更多的“非功能性”。Swift还包含不可变的数据。但是函数编程是关于不可变数据上的纯函数,而不是Swift。
(当然有很多非懒惰的函数式语言。懒惰和功能是正交的概念。哈斯克尔刚好同时拥抱了这两个人。)
不过,就眼前的问题而言:
我发现lazy属性在现实世界的Swift中很少有用(我很慷慨;我从未遇到过将它保存在代码中的情况)。它不能提供像你在哈斯克尔那样的懒惰。它不安全,,所以这是个噩梦。它强迫您进入引用类型(或强制您的结构是可变的),这样可能会很烦人。如果我听说他们把它从语言里拉出来,而我们只需要用自己的语言,那我就没问题了。(我很想写一份这样做的提案。)它实现了一种特定的备忘录模式,这种模式有时很方便,但通常不是您想要的。所以它不是默认的,这是一件非常好的事情。
您可能知道,默认情况下,全局变量和类变量是懒惰的,而且我认为这很好,因为它们的数量非常少,它们在实践中被访问的可能性要大得多,而惰性是线程安全的(这是有代价的,但由于它们非常稀少,成本要低得多)。
https://stackoverflow.com/questions/34841915
复制相似问题