轉:Swift惰性初始化(lazy)屬性

轉自http://www.helloswift.com.cn/swiftbase/2015/0414/3580.html
一 惰性初始化的定義

在Objective C中,惰性初始化是這樣寫的

@property (strong,nonatomic) CAShapeLayer * shapelayer;
-(CAShapeLayer *)shapelayer{
    if (!_shapelayer) { 
            _shapelayer = [CAShapeLayer layer];
      } 
 return _shapelayer;
}

那么何為惰性初始化呢?
從OC的代碼中不難看出,惰性初始化,就是在變量第一次使用的時候才進行初始化。

二 Swift中的惰性初始化

Swift中,有兩種方式來惰性初始化。 第一種,簡單表達式

 lazy var first = NSArray(objects: "1","2")

第二種,閉包

lazy var second:String = { return "second" }()

注意
不要忘記最后的小括號,只有加了小括號,必包才會在掉用的時候立刻執行。
要類型聲明lazy var second:String,這樣Xcode會進行類型檢查。

三 惰性初始化的使用場景

屬性本身依賴于外部因素才能初始化 completeURL表示完整的URL,這個變量依賴于自身的url是否含有http://前綴

class Demo{
 var url:NSString 
lazy var completeURL:NSString = {
 [unowned self] in if self.url.hasPrefix("http://"){
 return self.url }
else{
 return "http://".stringByAppendingString(self.url) } }() 
init(url:NSString){ self.url = url }}

屬性需要復雜計算,消耗大量CPU

lazy var second:Int = { var sum = 0 for i in 1...100000{ sum += i } return sum }()

屬性不確定是否會使用到

官網的例子,注意,對于Manager來說,使用的時候,可能導入,也可能不倒入數據。
從硬盤讀取數據的代價是很大的,不導入數據的時候,不要初始化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")manager.data.append("Some more data")

定制化的初始化
有些初始化只需要初始化一次,在變量定義的地方初始化,有助于代碼維護

lazy var dataArray:NSMutableArray = {
 var array = NSMutableArray()
 for i in 1...100{        
 array.addObject(NSNumber(integer: i))
 }
 return array }()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,259評論 4 61
  • 官方文檔 初始化 Initialization是為準備使用類,結構體或者枚舉實例的一個過程。這個過程涉及了在實例里...
    hrscy閱讀 1,151評論 0 1
  • XML正則 在Java Web開發中,Session為我們提供了很多方便,Session是由瀏覽器和服務器之間維護...
    _Weak閱讀 279評論 0 0
  • 思維導圖又叫心智圖,是表達發射性思維的有效的圖形思維工具 ,它簡單卻又極其有效。 思維導圖運用圖文并重的技巧,把各...
    sendy1126閱讀 599評論 0 0