標籤:
Swift 懶載入(lazy)在程式設計中,我們經常會使用
* 懶載入 * ,顧名思義,就是用到的時候再開闢空間,比如iOS開發中的最常用控制項
UITableView,實現資料來源方法的時候,通常我們都會這樣寫Objective-C
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.得到cell10 XWShopCell *cell = [XWShopCell cellWithTableView:tableView];11 12 //2.傳遞模型13 cell.wine = self.dataArray[indexPath.row];14 15 //3.回傳cell16 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方法,不重寫的話,會報錯,null 指標,所以一般我們會重寫get方法
1 //重寫get方法2 - (NSArray *)dataArray3 {4 if (nil == _dataArray){5 _dataArray = [NSArray array];6 }7 return _dataArray8 }
這樣寫,就防止了成員屬性為沒有賦值的情況
- 綜上所述,Objective-C的懶載入,其實就是調用成員屬性的get方法,初始化值,而Swift的懶載入,是和Objective-C不同的
Swift
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.回傳cell14 return cell15 }
1 return self.dataArray.count
- 在Swift 儲存屬性必須初始化,確認類型,或者用可選類型,總之要確認類型,畢竟Swfit是型別安全語言,所以Swift提出了lazy屬性,用法
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 tmpArray19 }()
上述的代碼,有點難理解,如果之前會Objective-C的block 或者對C語言的函數指標理解透徹的,可以看成是一個代碼塊,然後self.dataArray的時候,就執行了代碼塊,但是重複調用,Lazy 屬性的代碼塊只會調用一次,lazy修飾的是一個儲存屬性,而存放的是閉包,我想內部,應該進行了最佳化
個人愚見,內部有一個靜態儲存空間,當空間沒值的時候,就會執行閉包代碼,return 傳回值後,就會放到這個儲存空間內,有點像Objective-C的單例對象.
- 歡迎轉載,但請保留原地址boyXiong(大神:雄偉)
iOS 開發——實用技術Swift篇&Swift 懶載入(lazy)