好吧,这是一个有趣的问题,我不想暗示现有的答案不好,但我想我应该提出我的看法。
lazy
变量非常适合需要设置一次,然后永远不会重新设置的事情。它是一个变量,因此您可以将其更改为其他内容,但这违背了变量的目的lazy
变量(根据需要自行设置)。
选项更多的是那些可能会消失(并且可能会再次出现)的东西。每次都需要设置它们。
因此,让我们看一下侧面菜单的两种情况:一种是在不可见时保留在旁边,另一种是在被释放时保持不变。
lazy var sideMenu = SideMenu()
所以第一次sideMenu
属性被访问,SideMenu()
被调用并将其分配给该属性。即使您不使用该实例,该实例也会永远保留。
现在让我们看看另一种方法。
var _sideMenu: SideMenu?
var sideMenu: SideMenu! {
get {
if let sm = _sideMenu {
return sm
} else {
let sm = SideMenu()
_sideMenu = sm
return sm
}
}
set(newValue) {
_sideMenu = newValue
}
}
(请注意,这仅适用于类,不适用于结构。)
好的,那么这有什么作用呢?它的行为非常类似于lazy
var,但它可以让你将其重新设置为nil
。因此,如果您尝试访问sideMenu
,您一定会获得一个实例(要么是存储在_sideMenu
或新的)。这是一个类似的模式,它延迟加载SideMenu()
但这一个可以创造很多SideMenu()
实例,而上一个示例只能创建一次。
现在,大多数视图控制器都足够小,您可能应该使用lazy
从早些时候开始。
因此,对于同一问题有两种不同的方法。两者都有优点和缺点,并且在不同情况下效果更好或更差。