最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年03月06日 08:32:03   作者:Rinpe  
這篇文章主要給大家介紹了關(guān)于Swift中defer關(guān)鍵字推遲執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

大家應(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ì)腳本之家的支持。

相關(guān)文章

  • Swift教程之枚舉類型詳解

    Swift教程之枚舉類型詳解

    這篇文章主要介紹了Swift教程之枚舉類型詳解,本文講解了枚舉語(yǔ)法、匹配枚舉值與switch語(yǔ)句、關(guān)聯(lián)值、原始值等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Swift中圖片資源使用流程的優(yōu)化方法詳解

    Swift中圖片資源使用流程的優(yōu)化方法詳解

    這篇文章主要給大家介紹了關(guān)于Swift中圖片資源使用流程的優(yōu)化方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • swift 3.0中實(shí)現(xiàn)字符串截取、比較的方法示例

    swift 3.0中實(shí)現(xiàn)字符串截取、比較的方法示例

    時(shí),為了使用現(xiàn)有的字符串生成一個(gè)新的字符串,我們可以使用截取字符串的方法實(shí)現(xiàn)。下面這篇文章主要給大家介紹了關(guān)于swift 3.0中實(shí)現(xiàn)字符串截取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒。
    2017-10-10
  • 簡(jiǎn)單理解插入排序算法及Swift版的代碼示例

    簡(jiǎn)單理解插入排序算法及Swift版的代碼示例

    插入排序算法可以在已排序的序列中將要插入的元素和原有元素保持有序,這里我們來(lái)簡(jiǎn)單理解插入排序算法及Swift版的代碼示例,需要的朋友可以參考下
    2016-07-07
  • Swift實(shí)現(xiàn)表格視圖單元格多選

    Swift實(shí)現(xiàn)表格視圖單元格多選

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)表格視圖單元格多選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 通過(guò)示例分析Swift單例模式

    通過(guò)示例分析Swift單例模式

    這篇文章主要介紹了通過(guò)示例分析Swift單例模式的三種方法,分別是全局變量,內(nèi)部變量,dispatch_once方式,有需要的小伙伴可以參考下。
    2015-06-06
  • Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法示例

    Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法示例

    最近學(xué)完了swift想著實(shí)踐下,就通過(guò)一些簡(jiǎn)單的算法進(jìn)行學(xué)習(xí)研究,下面這篇文章主要介紹了Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03
  • 利用swift實(shí)現(xiàn)卡片橫向滑動(dòng)動(dòng)畫效果的方法示例

    利用swift實(shí)現(xiàn)卡片橫向滑動(dòng)動(dòng)畫效果的方法示例

    卡片橫向滑動(dòng)動(dòng)畫效果相信對(duì)大家來(lái)說(shuō)都不陌生,下面這篇文章主要給大家介紹了關(guān)于利用swift實(shí)現(xiàn)卡片橫向滑動(dòng)動(dòng)畫效果的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • 使用swift實(shí)現(xiàn)計(jì)算器功能

    使用swift實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了使用swift實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • swift中獲取字符串前綴的七種方法總結(jié)

    swift中獲取字符串前綴的七種方法總結(jié)

    在日常的開發(fā)中,經(jīng)常會(huì)需要獲取一個(gè)字符串的前綴,在這篇文章中我總結(jié)了在 Swift 中檢查字符串前綴的多種方法分享給大家,看看有沒(méi)有你不知道的
    2023-12-12

最新評(píng)論

腾冲县| 社会| 榆树市| 镇坪县| 永兴县| 休宁县| 高清| 衡水市| 桃源县| 鄯善县| 宜黄县| 裕民县| 卫辉市| 漳平市| 奉化市| 仙游县| 阿克| 宾川县| 临沂市| 福州市| 长治市| 沙河市| 镇雄县| 同心县| 华坪县| 惠水县| 兴隆县| 青河县| 修文县| 仁布县| 福州市| 琼中| 宁安市| 瓦房店市| 屯留县| 阜康市| 滨州市| 株洲市| 溆浦县| 新乡市| 万州区|