标签:
1 //必须实现的数据源代理方法 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3 { 4 return self.dataArray.count; 5 } 6 7 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 8 { 9 //1.得到cell 10 XWShopCell *cell = [XWShopCell cellWithTableView:tableView]; 11 12 //2.传递模型 13 cell.wine = self.dataArray[indexPath.row]; 14 15 //3.回传cell 16 return cell; 17 }
上面的的代码中
1 return self.dataArray.count;
其实就是利用
1 @property (nonatomic, strong) NSArray *dataArray;
@property 的特性,为属性生成了get和set方法,而这里是调用的get方法,但是上述代码中 return self.dataArray.count 会调用
- (NSArray *)dataArray { return _dataArray }
这样调用,如果成员属性dataArray 开始没有赋值的,那么在使用的时候,调用get方法,不重写的话,会报错,空指针,所以一般我们会重写get方法
1 //重写get方法 2 - (NSArray *)dataArray 3 { 4 if (nil == _dataArray){ 5 _dataArray = [NSArray array]; 6 } 7 return _dataArray 8 }
这样写,就防止了成员属性为没有赋值的情况
1 //MARK tablview的 dataSource 代理方法 2 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 3 return self.dataArray.count 4 } 5 6 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 7 //1.得到cell 8 let cell = XWShopCell.cellWithTableView(tableView) 9 10 //2.传递模型 11 cell.wine = self.dataArray[indexPath.row] 12 13 //3.回传cell 14 return cell 15 }
1 return self.dataArray.count
1 //1.分析 NSArray 是一个闭包的返回值,而这是一个没有参数的闭包 2 lazy var dataArray:NSArray = { 3 return [] 4 }() 5 6 //2.也可以写成这样 7 lazy var dataArray:NSArray = { 8 return NSArray() 9 }()
1 //3.从plist文件加载 2 lazy var dataArray:Array<XWWine> = { 3 let winePath = NSBundle.mainBundle().pathForResource("wine.plist", ofType: nil)! 4 5 let winesM = NSMutableArray(contentsOfFile: winePath); 6 7 var tmpArray:Array<XWWine>! = [] 8 9 for tmpWineDict in winesM! { 10 11 var wine:XWWine = XWWine.wineWithDict(tmpWineDict as! NSDictionary) 12 13 tmpArray.append(wine) 14 } 15 16 print("我就运行一次") 17 18 return tmpArray 19 }()
上述的代码,有点难理解,如果之前会Objective-C的block 或者对C语言的函数指针理解透彻的,可以看成是一个代码块,然后self.dataArray的时候,就执行了代码块,但是重复调用,Lazy 属性的代码块只会调用一次,lazy修饰的是一个存储属性,而存放的是闭包,我想内部,应该进行了优化
个人愚见,内部有一个静态的存储空间,当空间没值的时候,就会执行闭包代码,return 返回值后,就会放到这个存储空间内,有点像Objective-C的单例对象.
iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4725775.html