Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解
前言
大家應(yīng)該都知道,在一些語(yǔ)言中,有try/finally這樣的控制語(yǔ)句,比如Java。
這種語(yǔ)句可以讓我們?cè)趂inally代碼塊中執(zhí)行必須要執(zhí)行的代碼,不管之前怎樣的興風(fēng)作浪。
在Swift 2.0中,Apple提供了defer關(guān)鍵字,讓我們可以實(shí)現(xiàn)同樣的效果。
func checkSomething() {
print("CheckPoint 1")
doSomething()
print("CheckPoint 4")
}
func doSomething() {
print("CheckPoint 2")
defer {
print("Clean up here")
}
print("CheckPoint 3")
}
checkSomething() // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4
上述示例可以看到,在打印出“CheckPoint 2”之后并沒(méi)有打印出“Clean up here”,而是“CheckPoint 3”,這就是defer的作用,它對(duì)進(jìn)行了print("Clean up here")延遲。
我們?cè)賮?lái)看一個(gè)I/O的示例:
// 偽代碼
func writeSomething() {
let file = OpenFile()
let ioStatus = fetchIOStatus()
guard ioStatus != "error" else {
return
}
file.write()
closeFile(file)
}
上述示例是一個(gè)I/O操作的偽代碼,如果獲取到的ioStatus正常,那么該方法沒(méi)有問(wèn)題,
如果ioStatus取到的是error,那么會(huì)被guard語(yǔ)句抓到執(zhí)行return操作,
這樣的話closeFile(file)就永遠(yuǎn)都不會(huì)執(zhí)行了,一個(gè)嚴(yán)重的Bug就這樣產(chǎn)生了。
下面我們看看如何用defer來(lái)解決這個(gè)問(wèn)題:
// 偽代碼
func writeSomething() {
let file = OpenFile()
defer {
closeFile(file)
}
let ioStatus = fetchIOStatus()
guard ioStatus != "error" else {
return
}
file.write()
}
我們將closeFile(file)放在defer代碼塊里,這樣即使ioStatus為error,在執(zhí)行return前會(huì)先執(zhí)行defer里的代碼,這樣就保證了不管發(fā)生什么,最后都會(huì)將文件關(guān)閉。
需要注意的是, 雖然說(shuō)defer的內(nèi)容會(huì)在return之前執(zhí)行, 但是如果defer定義在return之后, 那么還是不會(huì)執(zhí)行defter的內(nèi)容, 也就是說(shuō), defer關(guān)鍵字必須比return早出現(xiàn)。
放在return之后:
var str = "Hello, playground"
func show() {
print("這里是即將要推遲(但一定會(huì))執(zhí)行的代碼")
}
func test() {
if str.characters.count >= 2 {
print("跳出該方法的執(zhí)行")
return
}
defer {
show()
}
}
test() // 輸出結(jié)果: 跳出該方法的執(zhí)行
放在return之前:
var str = "Hello, playground"
func show() {
print("這里是即將要推遲(但一定會(huì))執(zhí)行的代碼")
}
func test() {
defer {
show()
}
if str.characters.count >= 2 {
print("跳出該方法的執(zhí)行")
return
}
}
test() // 輸出結(jié)果: 跳出該方法的執(zhí)行 這里是即將要推遲(但一定會(huì))執(zhí)行的代碼
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)我們的支持。
欄 目:Swift
下一篇:Swift利用Decodable解析JSON的一個(gè)小問(wèn)題詳解
本文標(biāo)題:Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解
本文地址:http://www.jygsgssxh.com/a1/Swift/11965.html
您可能感興趣的文章
- 01-11swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景詳解
- 01-11Swift利用Decodable解析JSON的一個(gè)小問(wèn)題詳解
- 01-11Swift中初始化init的方法小結(jié)
- 01-11Swift中定義單例的方法實(shí)例
- 01-11Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼
- 01-11Swift中排序算法的簡(jiǎn)單取舍詳解
- 01-11Swift如何為設(shè)置中心添加常用功能
- 01-11Swift Json實(shí)例詳細(xì)解析
- 01-11Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能
- 01-11Swift 4.0中如何引用3.0的第三方庫(kù)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11Swift利用Decodable解析JSON的一個(gè)小問(wèn)題
- 01-11swift中defer幾個(gè)簡(jiǎn)單的使用場(chǎng)景詳解
- 01-11Swift中初始化init的方法小結(jié)
- 01-11Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解
- 01-11Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼
- 01-11Swift中定義單例的方法實(shí)例
- 01-11Swift中排序算法的簡(jiǎn)單取舍詳解
- 01-11Swift Json實(shí)例詳細(xì)解析
- 01-11Swift如何為設(shè)置中心添加常用功能
- 01-11Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文


