iOS 開發——實用技術Swift篇&Swift 懶載入(lazy)

來源:互聯網
上載者:User

標籤:

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.