Cod*_*ver 5 optional uikit lazy-initialization ios swift
Swift中的Lazy
或Optional
属性有什么区别?
例如,如果某人正在构建从侧面进入的导航栏,那么我认为所有这些都应该在一个之内UIViewController
。用户可能永远不会打开菜单,但有时会打开。
var menu: NavigationBar?
lazy var menu: NavigationBar = NavigationBar.initialize()
Run Code Online (Sandbox Code Playgroud)
我认为这两个可选代码都是不错的代码,因为除非需要,否则它们不会创建视图。我知道这Optional
意味着可能会有价值nil
。我也明白Lazy
,在我需要它之前,请不要担心。
具体问题
我的问题是它们的性能模式(安全性和速度)是否表示可选件更快,更安全,反之亦然?
好的,这是一个有趣的问题,我不想暗示现有的答案不好,但我想我会提出自己的看法。
lazy
变量非常适合需要先设置然后再重置的事情。它是一个变量,因此您可以将其更改为其他变量,但这违反了lazy
变量的目的(即根据需要进行设置)。
对于可能消失的东西(可能再次出现),可选的内容更多。每次都需要设置它们。
因此,让我们来看一下侧边菜单的两种情况:一种在不可见的情况下仍在菜单中,另一种在释放后的情况下在菜单中。
lazy var sideMenu = SideMenu()
Run Code Online (Sandbox Code Playgroud)
因此,第一次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
}
}
Run Code Online (Sandbox Code Playgroud)
(请注意,这仅适用于类,不适用于结构。)
好吧,这是怎么做的?好吧,它的行为与lazy
var 非常相似,但是让您将其重新设置为nil
。因此,如果尝试访问sideMenu
,则可以确保获得一个实例(存储在其中的实例_sideMenu
或新实例)。这是一种类似的模式,它延迟加载,SideMenu()
但是可以创建许多SideMenu()
实例,而上一个示例只能创建一次。
现在,大多数视图控制器都足够小,您可能应该lazy
早些时候就使用它。
因此,针对同一问题的两种不同方法。两者都有优点和缺点,并且在不同情况下效果会更好或更差。
归档时间: |
|
查看次数: |
2918 次 |
最近记录: |