lazy variable從iOS 7.0開始加入
當你需要的時候才建立複雜的object在iOS中是非常普遍的,Swift有一個適合運用在即時複雜運算的機制 – lazyvariable,
這些variable會利用function來建立,只有在被呼叫時才會跑function裡的內容,
整體來說可以節省處理的時間。
例子:
比方說一個費氏數列會寫成:
func fibonacci(of num: Int) -> Int { if num < 2 { return num } else { return fibonacci(of: num - 1) + fibonacci(of: num - 2) } }
試著在playground中跑這段code會發現它很慢,假設今天我們要在一個叫Person的struct中包含age和fibonacciAge的property,
但我們希望fibonacciAge直到真的需要用到時才做計算,就可以寫成:
struct Person { var age = 16 lazy var fibonacciOfAge: Int = { return fibonacci(of: self.age) }() }
這段程式碼有幾個重點:
- lazy property只能被指定為lazy var而無法為lazy let,lazy properties永遠都是variables
-
因為實際的值是經過計算來建立的,所以在最上方要先宣告資料型式,這裡指的是Int這個property
-
在function裡面需要用self,如果使用class而非structure的話,也要宣告為[unowned self]在function裡面避免retain cycle
-
在結尾處加上(),因為事實上這是在呼叫我們創建的function
當上面的程式碼都準備好之後,可以這樣來使用:
var singer = Person() singer.fibonacciOfAge
今天如果我們創建了1000個singer,但是都沒有使用到fibonacciOfAge的話,相較於沒用lazy var程式會執行的更快速。