oc和swift中的懒加载
2017.2.17
在TableView的代理方法中,
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{returnself.dataArray.count;}
这句 return self.dataArray.count;
其实就是利用
@property (nonatomic, strong) NSArray *dataArray;
@property的特性,为属性生成了get和set方法,而这里调用的get方法,但是上述代码中return self.dataArray.count会调用下面这句
- (NSArray *)dataArray {
return _dataArray
}
这样调用,如果成员属性dataArray开始没有复制的,那么在使用的时候,调用get方法,不重写的话,会报错,空指针,所以一般我们会重新get方法
//重写get方法- (NSArray *)dataArray{ if (nil == _dataArray){ _dataArray = [NSArray array]; } return _dataArray}
这样就防止了成员属性没有赋值的情况
综上所述,oc的懒加载其实就是调用成员属性的get方法,初始化值,而swift的懒加载和oc不同
在swift存储属性必须初始化,确认类型,或者用可选类型,总之要确认类型,毕竟swift是类型安全语言,所以swift提出了lazy属性,用法如下
//1.分析 NSArray 是一个闭包的返回值,而这是一个没有参数的闭包lazyvardataArray:NSArray= {[]} ()//2.也可以写成这样 lazy var dataArray:NSArray = { return NSArray() }()//3.从plist文件加载lazyvardataArray:Array = {letwinePath =NSBundle.mainBundle().pathForResource("wine.plist", ofType:nil)!letwinesM =NSMutableArray(contentsOfFile: winePath);vartmpArray:Array! = []fortmpWineDictinwinesM! {varwine:XWWine=XWWine.wineWithDict(tmpWineDictas!NSDictionary) tmpArray.append(wine) }print("我就运行一次")returntmpArray }()
上述代码可以看成是一个代码块,然后self.dataArray的时候,就执行了代码块,但是重复调用,lazy属性的代码块只会调用一次,lazy修饰的是一个存储属性,儿存放的是闭包。
懒加载就是惰性初始化,即在变量第一次使用的时候才进行初始化
swift中有两种方式俩惰性初始化
1.简单表达式
lazy var first = NSArray(objects: "1", "2")
2.闭包
lazy var second:String = {
return "second"
} ( )
注意:
不要忘记最后的小括号。只有加了小括号,闭包才会在调用的时候立刻执行。
要类型声明lazy var second:String,这样Xcode会进行类型检查。