雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

Swift

當(dāng)前位置:主頁(yè) > 軟件編程 > Swift >

Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-11|欄目:Swift|點(diǎn)擊:

前言

大家應(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中初始化init的方法小結(jié)

欄    目:Swift

下一篇:Swift利用Decodable解析JSON的一個(gè)小問(wèn)題詳解

本文標(biāo)題:Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解

本文地址:http://www.jygsgssxh.com/a1/Swift/11965.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有