欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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自定義UITableViewCell背景色

    Swift自定義UITableViewCell背景色

    這篇文章主要為大家詳細(xì)介紹了Swift自定義UITableViewCell背景色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift實(shí)現(xiàn)Selection Sort選擇排序算法的實(shí)例講解

    Swift實(shí)現(xiàn)Selection Sort選擇排序算法的實(shí)例講解

    選擇排序是一種穩(wěn)定的排序算法,且實(shí)現(xiàn)代碼通常比冒泡排序要來(lái)的簡(jiǎn)單,這里我們就來(lái)看一下Swift實(shí)現(xiàn)Selection Sort選擇排序的實(shí)例講解
    2016-07-07
  • Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼

    Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Swift學(xué)習(xí)筆記之元組(tuples)

    Swift學(xué)習(xí)筆記之元組(tuples)

    這篇文章主要給大家介紹了Swift中元組(tuples)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • Swift使用表格組件實(shí)現(xiàn)單列表

    Swift使用表格組件實(shí)現(xiàn)單列表

    這篇文章主要為大家詳細(xì)介紹了Swift使用表格組件實(shí)現(xiàn)單列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift教程之集合類(lèi)型詳解

    Swift教程之集合類(lèi)型詳解

    這篇文章主要介紹了Swift教程之集合類(lèi)型詳解,Swift 提供兩種集合類(lèi)型來(lái)存儲(chǔ)集合,數(shù)組和字典,本文詳細(xì)講解了數(shù)組的創(chuàng)建、讀取和修改數(shù)組、遍歷數(shù)組以及集合的操作等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • LeetCode?題解?Swift?有效的完全平方數(shù)

    LeetCode?題解?Swift?有效的完全平方數(shù)

    這篇文章主要為大家介紹了LeetCode?題解?Swift?有效的完全平方數(shù)方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Swift用final關(guān)鍵字來(lái)防止重寫(xiě)

    Swift用final關(guān)鍵字來(lái)防止重寫(xiě)

    final關(guān)鍵字在大多數(shù)的編程語(yǔ)言中都存在,表示不允許對(duì)其修飾的內(nèi)容進(jìn)行繼承或者重新操作。下面通過(guò)實(shí)例代碼給大家介紹swift用final關(guān)鍵字來(lái)防止重寫(xiě)
    2016-12-12
  • Swift編程中的初始化與反初始化完全講解

    Swift編程中的初始化與反初始化完全講解

    這篇文章主要介紹了Swift編程中的初始化與反初始化完全講解,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • 探討Swift數(shù)組和字典

    探討Swift數(shù)組和字典

    Swift數(shù)組是具體的。他不同于Objective-C的的NSArray和NSMutableArray里的類(lèi),它可以存儲(chǔ)任何類(lèi)型的對(duì)象,不提供有關(guān)它們返回的對(duì)象的性質(zhì)的任何信息
    2015-12-12

最新評(píng)論