Swift - 懒加载的实现

作者: flionel | 来源:发表于2016-09-04 20:06 被阅读7410次
    lazy-loading-in-swift.jpg

    懒加载的优点

    懒加载(lazy load),其实是延时加载,它的优点显而易见,首先,懒加载将对象的创建延迟到了需要对象的时候,这样减少了内存开销;其次,懒加载将创建对象、相关属性设置内聚在一个"{}"代码块内,降低了其他模块代码的复杂度。

    懒加载的swift实现

    在Objective-C时代,我们就经常使用懒加载,此处不多赘述。在swift中,实现懒加载需要lazyvar关键字,例如为WKWebView懒加载对象wkWebView,可以用如下swift实现,

    let kScreenWidth = UIScreen.mainScreen().bounds.size.width
    let kScreenHeight = UIScreen.mainScreen().bounds.size.height
    
    class ViewController: UIViewController {
        
        lazy var wkWebView: WKWebView = {
            () -> WKWebView in
            let tempWebView = WKWebView()
            tempWebView.navigationDelegate = self
            return tempWebView
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let someURL = ...
            let request: NSURLRequest = NSURLRequest(URL: someURL)
            self.wkWebView.loadRequest(request)
            self.wkWebView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight)
            self.view.addSubview(self.wkWebView)
        }
    }
    

    Swift实现懒加载必须使用var关键字来定义延时加载的属性,而不可以使用let关键字,因为let关键字定义的是常量,而常量必须在实例创建时赋值。根据上面的demo的规范,可以总结swift定义懒加载的规则,即"后面通过等号赋值一个闭包,闭包后面必须加上()"。

    上述demo的懒加载定义还可以再次简化,如下所示,

    lazy var wkWebView: WKWebView = {
        let tempWebView = WKWebView()
        tempWebView.navigationDelegate = self
        return tempWebView
    }()
    

    删减了闭包的参数、返回值以及in关键字,这是在闭包赋值时的简化形式,关于闭包,笔者正在编写相关文章,尽请期待_

    懒加载总结

    近期项目在使用WKWebView替代UIWebView,发现WKWebView竟然不能通过xib拖拽创建,只能通过手写代码实现。手写代码麻烦之处在于创建一个对象时需要设置很多关联属性,比如创建WKWebView对象,需要赋值navigationDelegate、布局frame,以及其他的相关属性,在未来的某个时期可能会增加更多的关联属性的设置,这样在-viewDidLoad中代码会越来越多,使用懒加载无疑可以将创建对象、设置对象属性的操作内聚于懒加载内部,减少-viewDidLoad中的代码量和复杂度,代码更具有可读性。

    参考链接

    公众号

    欢迎关注本人公众号foolishlion,请扫描下方二维码,

    foolishlion.jpg

    相关文章

      网友评论

        本文标题:Swift - 懒加载的实现

        本文链接:https://www.haomeiwen.com/subject/hpglettx.html