swift的懒加载

懒加载的优点

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

懒加载的swift实现

在Objective-C时代,我们就经常使用懒加载,此处不多赘述。在swift中,实现懒加载需要lazy和var关键字,例如为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中的代码量和复杂度,代码更具有可读性。

你可能感兴趣的:(swift的懒加载)