Swift - 懒加载的实现
2016-09-04 本文已影响7410人
flionel
lazy-loading-in-swift.jpg
懒加载的优点
懒加载(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中的代码量和复杂度,代码更具有可读性。
参考链接
公众号
欢迎关注本人公众号foolishlion,请扫描下方二维码,
foolishlion.jpg