Swift Lazy和Optional属性

Cod*_*ver 5 optional uikit lazy-initialization ios swift

Swift中的LazyOptional属性有什么区别?

例如,如果某人正在构建从侧面进入的导航栏,那么我认为所有这些都应该在一个之内UIViewController。用户可能永远不会打开菜单,但有时会打开。

var menu: NavigationBar?
lazy var menu: NavigationBar = NavigationBar.initialize()
Run Code Online (Sandbox Code Playgroud)

我认为这两个可选代码都是不错的代码,因为除非需要,否则它们不会创建视图。我知道这Optional意味着可能会有价值nil。我也明白Lazy,在我需要它之前,请不要担心。

具体问题

我的问题是它们的性能模式(安全性和速度)是否表示可选件更快,更安全,反之亦然?

Ash*_*row 6

好的,这是一个有趣的问题,我不想暗示现有的答案不好,但我想我会提出自己的看法。

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)

(请注意,这仅适用于类,不适用于结构。)

好吧,这是怎么做的?好吧,它的行为与lazyvar 非常相似,但是让您将其重新设置为nil。因此,如果尝试访问sideMenu,则可以确保获得一个实例(存储在其中的实例_sideMenu或新实例)。这是一种类似的模式,它延迟加载,SideMenu()但是可以创建许多SideMenu()实例,而上一个示例只能创建一次。

现在,大多数视图控制器都足够小,您可能应该lazy早些时候就使用它。

因此,针对同一问题的两种不同方法。两者都有优点和缺点,并且在不同情况下效果会更好或更差。