轉(zhuǎn)自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的代碼中不難看出京髓,惰性初始化,就是在變量第一次使用的時(shí)候才進(jìn)行初始化策州。
二 Swift中的惰性初始化
Swift中院溺,有兩種方式來惰性初始化眉菱。 第一種,簡(jiǎn)單表達(dá)式
lazy var first = NSArray(objects: "1","2")
第二種拐格,閉包
lazy var second:String = { return "second" }()
注意
不要忘記最后的小括號(hào)僧免,只有加了小括號(hào),必包才會(huì)在掉用的時(shí)候立刻執(zhí)行捏浊。
要類型聲明lazy var second:String懂衩,這樣Xcode會(huì)進(jìn)行類型檢查。
三 惰性初始化的使用場(chǎng)景
屬性本身依賴于外部因素才能初始化 completeURL表示完整的URL,這個(gè)變量依賴于自身的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 }}
屬性需要復(fù)雜計(jì)算浊洞,消耗大量CPU
lazy var second:Int = { var sum = 0 for i in 1...100000{ sum += i } return sum }()
屬性不確定是否會(huì)使用到
官網(wǎng)的例子牵敷,注意,對(duì)于Manager來說法希,使用的時(shí)候枷餐,可能導(dǎo)入,也可能不倒入數(shù)據(jù)苫亦。
從硬盤讀取數(shù)據(jù)的代價(jià)是很大的毛肋,不導(dǎo)入數(shù)據(jù)的時(shí)候,不要初始化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")
定制化的初始化
有些初始化只需要初始化一次屋剑,在變量定義的地方初始化润匙,有助于代碼維護(hù)
lazy var dataArray:NSMutableArray = {
var array = NSMutableArray()
for i in 1...100{
array.addObject(NSNumber(integer: i))
}
return array }()