日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift中的延迟加载(懒加载)

發(fā)布時(shí)間:2023/12/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift中的延迟加载(懒加载) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Swift方式的延遲加載

而在Swift中,你只需一行代碼即可實(shí)現(xiàn)此機(jī)制:

lazy var players = String[]()

簡(jiǎn)單、簡(jiǎn)潔,直入主題。

但你得記住,你必須使用var關(guān)鍵字來定義延遲加載的屬性,不能使用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í)例方法來初始化延遲加載屬性:

lazy var players: String[] = self.initialPlayers() func initialPlayers() -> String[] {var players = ["Mike Buss"]return players }

或者用個(gè)類方法也可以:

lazy var players = MultipeerManager.initialPlayers() class func initialPlayers() -> String[] {var players = ["Mike Buss"]return players }

但大家現(xiàn)在更傾向于使用新的閉包語法,因?yàn)樗鼘⑦壿嫶a就定義在了屬性聲明的旁邊。

何時(shí)使用延遲加載?

一種使用場(chǎng)景是,一個(gè)對(duì)象的屬性的初始值依賴與其它的屬性,所以必須先創(chuàng)建出這個(gè)對(duì)象,才能知道這個(gè)屬性的值。

舉例來說,你有一個(gè)Person類以及一個(gè)personalizedGreeting屬性。這個(gè)personalizedGreeting屬性需要在對(duì)象創(chuàng)建完成后才延遲加載,因?yàn)橹挥性趯?duì)象創(chuàng)建完成后它才能知道問候的人是誰(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]來避免循環(huán)引用。[unowned self]定義了一個(gè)在閉包中需要使用的、存在于閉包外的屬性/變量列表,又叫捕獲列表(capture list)。

當(dāng)你實(shí)例化一個(gè)person時(shí),他的問候語greeting此時(shí)并沒有創(chuàng)建:

let person = Person(name: "Robert Redford”) // person.personalizedGreeting is nil

但是當(dāng)你嘗試打印出問候語時(shí),這句問候語會(huì)自動(dòng)生成出來:

NSLog(person.personalizedGreeting) // personalizedGreeting is calculated when used // and now contains the value "Hello, Robert Redford!"

另一種適合延遲加載的場(chǎng)景,是在屬性的初始值需要進(jìn)行大量計(jì)算之時(shí)。

舉例來說,當(dāng)你有個(gè)對(duì)象需要執(zhí)行一個(gè)高負(fù)荷的算法來確定一張圖片中的人臉個(gè)數(shù),你可以將numberOfFaces屬性設(shè)置為延遲加載。

或者當(dāng)你有個(gè)類需要計(jì)算多個(gè)大數(shù)的值,你希望它們能在需要的時(shí)候才被計(jì)算出來:

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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。