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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

编程问答

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

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

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。