Swift中的延迟加载(懒加载)
Swift方式的延遲加載
而在Swift中,你只需一行代碼即可實(shí)現(xiàn)此機(jī)制:
lazy var players = String[]()簡(jiǎn)單、簡(jiǎn)潔,直入主題。
但你得記住,你必須使用var關(guān)鍵字來(lái)定義延遲加載的屬性,不能使用let關(guān)鍵字,因?yàn)槌A勘仨氃趯?shí)例構(gòu)建時(shí)賦值。
如果你想給延遲加載加上一些邏輯處理,Swift允許你在屬性后面定義一個(gè)閉包調(diào)用(閉包的返回值會(huì)作為屬性的默認(rèn)值):
lazy var players: String[] = {var temporaryPlayers = String[]()temporaryPlayers.append("Mike Buss")return temporaryPlayers}()如果你愿意,你也可以使用實(shí)例方法來(lái)初始化延遲加載屬性:
lazy var players: String[] = self.initialPlayers() func initialPlayers() -> String[] {var players = ["Mike Buss"]return players }或者用個(gè)類(lèi)方法也可以:
lazy var players = MultipeerManager.initialPlayers() class func initialPlayers() -> String[] {var players = ["Mike Buss"]return players }但大家現(xiàn)在更傾向于使用新的閉包語(yǔ)法,因?yàn)樗鼘⑦壿嫶a就定義在了屬性聲明的旁邊。
何時(shí)使用延遲加載?
一種使用場(chǎng)景是,一個(gè)對(duì)象的屬性的初始值依賴(lài)與其它的屬性,所以必須先創(chuàng)建出這個(gè)對(duì)象,才能知道這個(gè)屬性的值。
舉例來(lái)說(shuō),你有一個(gè)Person類(lèi)以及一個(gè)personalizedGreeting屬性。這個(gè)personalizedGreeting屬性需要在對(duì)象創(chuàng)建完成后才延遲加載,因?yàn)橹挥性趯?duì)象創(chuàng)建完成后它才能知道問(wèn)候的人是誰(shuí)(person的name)。請(qǐng)看代碼:
class Person {var name: Stringlazy var personalizedGreeting: String = {[unowned self] inreturn "Hello, \(self.name)!"}()init(name: String) {self.name = name} }注意,你必須使用?[unowned self]來(lái)避免循環(huán)引用。[unowned self]定義了一個(gè)在閉包中需要使用的、存在于閉包外的屬性/變量列表,又叫捕獲列表(capture list)。
當(dāng)你實(shí)例化一個(gè)person時(shí),他的問(wèn)候語(yǔ)greeting此時(shí)并沒(méi)有創(chuàng)建:
let person = Person(name: "Robert Redford”) // person.personalizedGreeting is nil但是當(dāng)你嘗試打印出問(wèn)候語(yǔ)時(shí),這句問(wèn)候語(yǔ)會(huì)自動(dòng)生成出來(lái):
NSLog(person.personalizedGreeting) // personalizedGreeting is calculated when used // and now contains the value "Hello, Robert Redford!"另一種適合延遲加載的場(chǎng)景,是在屬性的初始值需要進(jìn)行大量計(jì)算之時(shí)。
舉例來(lái)說(shuō),當(dāng)你有個(gè)對(duì)象需要執(zhí)行一個(gè)高負(fù)荷的算法來(lái)確定一張圖片中的人臉個(gè)數(shù),你可以將numberOfFaces屬性設(shè)置為延遲加載。
或者當(dāng)你有個(gè)類(lèi)需要計(jì)算多個(gè)大數(shù)的值,你希望它們能在需要的時(shí)候才被計(jì)算出來(lái):
class MathHelper {lazy var pi: Double = {// Calculate pi to an insane number of digitsreturn resultOfCalculation}()}轉(zhuǎn)載于:https://www.cnblogs.com/Rinpe/p/5467567.html
總結(jié)
以上是生活随笔為你收集整理的Swift中的延迟加载(懒加载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 中文乱码解决方法
- 下一篇: android布局1