標籤:
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")
swift 上的 lazy