swift 上的 lazy

lazy顾名思义就是慢吞吞的,万非得一就不动。

那么一个变量也是如此,只有你第一次使用的时候才进去加载。所有又称为延迟加载,需要的时候才加载。

=========

这样做的好处:

1. 模块化,把对象的代码都写在了get方法中,代码的可读性更强。

2. 占用内存小【在某些情况下,不一定该对象一定要创建】,按需加载

=======

如何体现?

1.oc:

- (UITableView *)tableView{

  if(!_tableView){

    _tableView = [[UITableView alloc] init];

  }

  return _tableView;

}// 只有第一次调用self.tableView的时候会_tableView才会被创建

2.swift:

2.1 简单的表达式:lazy var dataArr = Array<Product>()

2.2 闭包:lazy var titleStr:String = {return "title"}()

============

使用的例子:

1. 需要对属性进一步加工才能使用

class LazyDemo {

var url:String

lazy var requestUrl:String = {

[unowned self] in

if self.url.hasPrefix("http://"){

return self.url

}else{

return "http://".stringByAppendingString(self.url)

}

}()

init(url:String){

self.url = url

}

}

2. 需要复杂计算

lazy var second:Int = {

var sum = 0

for i in 1...100000{

sum += i

}

return sum

}()

3. 属性不确定是否会被使用:例子来源官网

class DataImporter {

/*

DataImporter is a class to import data from an external file.

The class is assumed to take a non-trivial amount of time to initialize.

*/

var fileName = "data.txt"

// the DataImporter class would provide data importing functionality here

}

class DataManager {

lazy var importer = DataImporter()

var data = [String]()

// the DataManager class would provide data management functionality here

}

let manager = DataManager()

manager.data.append("Some data")  // 这个时候才初始化 importer

manager.data.append("Some more data")

上一篇:Android NDK开发Crash错误定位[转]


下一篇:jQuery $.ajax跨域-JSONP获取JSON数据(转载)