Swift - 懒加载的实现

Swift - 懒加载的实现_第1张图片
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中的代码量和复杂度,代码更具有可读性。

参考链接

  • lazy-loading-properties-in-swift

公众号

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

Swift - 懒加载的实现_第2张图片
foolishlion.jpg

你可能感兴趣的:(Swift - 懒加载的实现)