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程式會執行的更快速。

參考來源:What are lazy variables?