【发布时间】:2016-04-22 20:49:34
【问题描述】:
比较定义实例属性的这两个选项:
var networkManager = NetworkManager.sharedInstance()
var lazy networkManager = NetworkManager.sharedInstance()
两者:
- 可以评估块以获取值
- 可以内联声明(不是块,如上)
懒惰:
- 可以参考自己
- 直到需要才计算
- 如果你不使用它,它永远不会被计算
非懒惰:
- 没有任何好处
使用非惰性变量似乎没有任何好处。那么为什么语言允许程序员做出这种劣等的选择呢?
(我不是在问 var 和 let à la Are Swift constants lazy by default? 之间的区别)
【问题讨论】:
-
坦率地说,lazy 初始化是要避免的。它在应用程序中引入了非确定性行为,并且是永无止境的调试冒险的源泉。它还使重构变得更加困难,因为每次更改都有可能由于意外的行为更改而导致无法预料的更改。
-
@FullDecent “类属性”不是正确的术语,Swift 中没有这样的东西(在说话的时候)。有实例属性和类型属性……
-
添加到上层 cmets:它应该是可选的,因为您不希望看到一些性能影响,因为在子例程开始时分配内存。大多数情况下,速度太重要了。而且在调试方面,如果它是默认的,那将是一件很痛苦的事情。
-
@Whirlwind 谢谢更新
-
这也可能是一个原因:
If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there is no guarantee that the property will be initialized only once.
标签: swift