轉自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 }()