[譯] 在 iOS Swift 中的懶加載變量

這篇文章解釋了在 Swift 中懶加載變量是如何工做的,你必須對閉包有一些瞭解。前端

閱讀這篇文章獲取更多關於閉包的信息.android

當咱們進行 iOS 開發時,咱們應該很是關注應用程序的內存佔用狀況。若是應用程序很複雜,那麼內存問題就會是對於開發者的一個主要的挑戰。因此,首先考慮到內存分配問題的開發者可以真正的寫出優化的代碼。除非確實有必要,不然開發者要避免作一些耗時的工做。那些複雜的分配內存操做會消耗更多的時間,而且對於程序的性能有嚴重的影響。ios

Swift 有內置在語言中的機制,能夠即時的計算那些耗時工做。它叫作懶加載變量。這種變量只有在你第一次須要它的時候才被指定的方法建立。若是從沒有使用過該變量。那麼方法就不會運行,因此它能夠幫助減小一些處理時間。git

蘋果的官方文檔寫道:github

一個懶加載儲存屬性是種只有在首次使用時,才計算其初始值的屬性。你能夠經過在聲明前加 lazy 修飾符來標示一個懶加載存儲屬性。swift

你必須將一個懶加載屬性聲明爲一個變量(經過 var 關鍵字),由於它的初始化值也許不能得到,直到實例的初始化完成。常量屬性在初始化完成以前必定會有一個值,所以不能用懶加載聲明。後端

爲了解釋這些,我會使用一個很基礎的示例:假設有一個結構體叫作 InterviewCandidate。它有一個可選的布爾值,決定候選人正在申請 iOS 或者 Android。iOSResumeDescription 和 androidResumeDescription 被聲明爲懶加載屬性。那麼在下面的代碼中,一我的是 iOS 開發者,懶加載變量 iOSResumeDescription 將會在調用打印方法的時候被初始化。沒有被調用的 androidResumeDescription 就會是 nil。安全

//: Playground - noun: 人們用來玩耍的地方
import UIKit


struct InterviewCandidate {
    var isiOS:Bool?
    
    lazy var iOSResumeDescription: String = {
        return "I am an iOS developer"
    }()
    lazy var androidResumeDescription: String = {
        return "I am an android developer"
    }()
}

var person1 = InterviewCandidate()
person1.isiOS = true

if person1.isiOS! {
    print(person1.iOSResumeDescription)
} else {
    print(person1.androidResumeDescription)

}
複製代碼

這是一個很是基礎的例子。若是咱們有一個複雜的類或結構,它包含從循環的函數返回結果的計算變量,而且若是咱們建立 1000 個這樣的對象,那麼性能和內存將會受到影響。閉包

懶加載存儲屬性 vs 存儲屬性

這有一些懶加載屬性相對於存儲屬性的優勢。函數

  1. 只有在讀取懶加載屬性時,纔會執行與該屬性關聯的閉包。 所以,若是因爲某種緣由該屬性未被使用(多是由於用戶的某些決定),則能夠避免沒必要要的分配和計算。

  2. 你可使用一個存儲屬性給懶加載屬性賦值。

  3. 注意 你可以在懶加載的屬性閉包內部使用 self。這不會致使任何循環引用。緣由在於它當即使用的這個閉包 {}() 被認爲是 @noescape。它不會引用捕獲的 self

可是,若是你在 方法 中使用 self。事實上,若是你正在使用的是一個類而不是結構體,你也應該在你的方法內聲明 [unowned self] 那樣你纔不會建立一個強引用(查看下面的代碼)。

// playground code

import UIKit
import Foundation

class InterviewTest {
	var name: String
	lazy var greeting : String = { returnHello \(self.name)」 }()
	// 這裏沒有循環引用 ..

	init(name: String) {
		self.name = name
	}
}

let testObj = InterviewTest(name:」abhi」)

testObj.greeting
複製代碼

你可以引用這個變量,不管你是否使用了閉包。

lazy var iOSResumeDescription = 「I am an iOS developer」
複製代碼

這樣的語法也能夠運行。

注意:記住,懶加載屬性的用途是隻有它們第一次被須要的時候纔會被計算,在這以後它們的值就被存儲下來了。因此,若是你第二次使用 iOSResumeDescription,預先存儲的屬性就會返回。

懶加載規則:

  • 你不能對 let 類型使用 lazy

  • 你不能對於 計算屬性 使用它。由於一個計算屬性會在每次咱們試圖訪問它的時候去執行在計算代碼塊中的代碼並返回相應的值。

  • 你只能對 structclass 的成員使用 lazy

  • 懶加載變量不是原子初始化類型,因此它並非線程安全的。

若是你喜歡閱讀這篇文章,那麼分享和推薦它以便其餘人可以看到💚💚💚💚💚💚!

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索