Swift之Defer

Swift2.0中加入了defer新語(yǔ)法聲明。defer譯為延緩、推遲之意。那么在Swift2.0中它將被應(yīng)用于什么位置呢?比如,讀取某目錄下的文件內(nèi)容并處理數(shù)據(jù),你需要首先定位到文件目錄,打開文件夾,讀取文件內(nèi)容以及處理數(shù)據(jù),關(guān)閉文件以及文件夾。倘若一切順利,只需按照設(shè)定好的程序流程走一輪即可;不過(guò)考慮事情要面面俱到,倘若中間某個(gè)環(huán)節(jié)失敗,比如讀取文件內(nèi)容失敗、處理數(shù)據(jù)失敗等等,還需要進(jìn)行一些后續(xù)收尾工作,即關(guān)閉文件或關(guān)閉文件夾(當(dāng)然就算順利執(zhí)行,也是要關(guān)閉的)。

先談?wù)刣efer的基礎(chǔ)語(yǔ)法,聲明方式如下:

defer{// 做一些事情}

可以看到聲明方式非常簡(jiǎn)單,defer關(guān)鍵字打頭,緊跟{}程序塊,大括號(hào)中添加延遲處理代碼。平常應(yīng)用方式如下:

funcdoSomethingWithDefer(){// 1openDirectory()// 2defer{closeDirectory()}// 3openFile()// 4defer{closeFile()}// 做其他雜七雜八事情...}

分析代碼:

定位到目錄并打開指定文件夾,倘若打開文件夾失敗則結(jié)束函數(shù)。

主要到defer的用法,這條語(yǔ)句并不會(huì)馬上執(zhí)行,而是被推入棧中,直到函數(shù)結(jié)束時(shí)才再次被調(diào)用。

打開文件,倘若失敗則結(jié)束函數(shù)。

defer內(nèi)容關(guān)閉文件,這條語(yǔ)句一樣不會(huì)被馬上執(zhí)行,而是推入棧中,此時(shí)它位于defer{closeDirectory()}語(yǔ)句的上方,直到函數(shù)結(jié)束時(shí)才再次被調(diào)用。

倘若一切都順利,函數(shù)運(yùn)行到最后了,開始從棧中依次彈出方才推入的defer語(yǔ)句,首先是closeFile(),其次是closeDirectory()。確實(shí)當(dāng)我們處理完文件,需要先關(guān)閉文件,再關(guān)閉文件夾。

現(xiàn)在試想一種情況,我們已經(jīng)打開文件夾,并且推closeDirectory()到棧中,執(zhí)行第三步openFile()操作的時(shí)候出錯(cuò)了!那么下面所有操作就無(wú)法進(jìn)行下去,結(jié)束整個(gè)函數(shù)了!前文說(shuō)到函數(shù)結(jié)束時(shí)開始執(zhí)行defer棧中的內(nèi)容,關(guān)閉文件夾。會(huì)有人說(shuō)怎么不關(guān)閉文件,拜托失敗了就意味著文件沒(méi)被打開,何來(lái)關(guān)閉一說(shuō)。

最后必須說(shuō)下defer的作用域,這點(diǎn)灰常重要。

注意作用域,其次是調(diào)用順序——即一個(gè)作用域結(jié)束,該作用域中的defer語(yǔ)句自下而上調(diào)用。

funclookforSomething(name:String)throws{//這里是作用域1 整個(gè)函數(shù)作用域print("1-1")ifname ==""{//這里是作用域2 if的作用域print("2-1")defer{print("2-2")? ? }print("2-3")? }print("1-2")defer{print("1-3")? }print("1-4")ifname =="hello"{//作用域3print("3-1")defer{print("3-2")? ? }print("3-3")defer{print("3-4")? ? }? }}//有興趣的看看依次輸出什么//try! lookforSomething("")//調(diào)出 debug Area 快捷鍵 shift+ command + ytry! lookforSomething("hello")

其實(shí)先前有個(gè)地方說(shuō)的不準(zhǔn)確,并不是函數(shù)結(jié)束時(shí)開始執(zhí)行defer棧推出操作,而是每當(dāng)一個(gè)作用域結(jié)束就進(jìn)行該作用域defer執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,319評(píng)論 0 17
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,190評(píng)論 1 10
  • 兩朵小花 在洗澡 兩個(gè)寶寶 要長(zhǎng)高 ——by the可妹(31M27D) 背景:睡前洗漱
    蔣蔣有話講閱讀 208評(píng)論 0 0
  • 我們所度過(guò)的每一個(gè)日常 也許就是連續(xù)發(fā)生的奇跡 年輕的情侶牽手的樣子 就像是萬(wàn)物起源的樣子
    柳金蟬閱讀 221評(píng)論 0 0
  • 【知-學(xué)習(xí)】 《六項(xiàng)精進(jìn)》大綱朗讀1遍。 【經(jīng)典名句分享】 時(shí)間如此之快,眨眼就是一天,眨眼就是一年。人生百年,轉(zhuǎn)...
    玉_蓮子閱讀 168評(píng)論 0 0

友情鏈接更多精彩內(nèi)容