国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Swift > 正文

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

2020-03-09 17:42:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

大家應(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操作,

這樣的話(huà)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ì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 苍溪县| 敦煌市| 彭阳县| 瑞昌市| 中方县| 宁阳县| 滦南县| 昌都县| 静海县| 永修县| 宜黄县| 昌宁县| 关岭| 三门县| 西峡县| 康保县| 贵溪市| 蓬溪县| 金门县| 清镇市| 肃宁县| 铜陵市| 建平县| 定襄县| 若尔盖县| 长岛县| 宜兰市| 深圳市| 广宗县| 沙坪坝区| 紫云| 淮南市| 武平县| 都江堰市| 沛县| 大庆市| 南皮县| 日照市| 中山市| 张家口市| 南华县|