<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • Swift 閉包簡單使用

          2020-3-30    seo達人

          在Swift開發文檔中是這樣介紹閉包的:閉包是可以在你的代碼中被傳遞和引用的功能性獨立模塊。

          Swift閉包

          閉包的形式

          Swift中的閉包有很多優化的地方

          創建基本的閉包

          在閉包中接收參數

          從閉包中返回值

          閉包作為參數

          尾隨閉包語法

          值捕獲

          逃逸閉包

          閉包的形式

          全局函數 嵌套函數 閉包表達式

          有名字但不能捕獲任何值。 有名字,也能捕獲封閉函數內的值。 無名閉包,使用輕量級語法,可以根據上下文環境捕獲值。

          Swift中的閉包有很多優化的地方

          根據上下文推斷參數和返回值類型



          從單行表達式閉包中隱式返回(也就是閉包體只有一行代碼,可以省略return)



          可以使用簡化參數名,如$0, $1(從0開始,表示第i個參數…)



          提供了尾隨閉包語法(Trailing closure syntax)



          閉包是引用類型:無論你將函數或閉包賦值給一個常量還是變量,你實際上都是將常量或變量的值設置為對應函數或閉包的引用



          創建基本的閉包

          let bibao = {

            print("我要創建閉包")

          }



          上面的代碼實際上創建了一個匿名的函數,并將這個函數賦給了 driving。之后你就可以把 driving() 當作一個常規的函數來用,就像這樣:



          bibao()



          在閉包中接收參數

          當你創建閉包的時候,它們并沒有名字,也沒有提供書寫參數的地方。但這并不意味著它們不能接收參數,只不過它們接收參數的方式稍有不同:這些參數是被寫在 花括號里面的。



          為了讓一個閉包接收參數,你需要在花括號之后把這些參數列出來,然后跟上一個 in 關鍵字。這樣就告訴Swift,閉包的主體是從哪里開始的。



          舉個例子,我們來創建一個閉包,接收一個叫 place 的字符串作為唯一的參數,就像這樣:



          let bibao= { (bao1: String) in

            print("我要創建 (bao1)。")

          }



          函數和閉包的一個區別是運行閉包的時候你不會用到參數標簽。因此,調用 driving() 的時候,我們是這樣寫的:



          bibao("閉包")



          從閉包中返回值

          閉包也能返回值,寫法和閉包的參數類似:寫在閉包內部, in 關鍵字前面。



          還是以 driving() 閉包為例, 讓它返回一個字符串。原來的函數是這樣的:



          let bibao= { (bao1: String) in

            print("我要創建  (bao1)。")

          }



          改成返回字符串而不是直接打印那個字符串,需要 in 之前添加 -> String,然后像常規函數那樣用到 return 關鍵字:



          let drivingWithReturn = { (bao1: String) -> String in

            return "我要創建 (bao1)。"

          }



          現在我們運行這個閉包并且打印出它的返回值:



          let message = drivingWithReturn("閉包")

          print(message)



          閉包作為參數

          既然閉包可以像字符串和整數一樣使用,你就可以將它們傳入函數。閉包作為參數的語法乍一看一看挺傷腦筋的,讓我們慢慢來。



          首先,還是基本的 driving() 閉包。



          let driving = {

            print("我正在創建")

          }



          如果我們打算把這個閉包傳入一個函數,以便函數內部可以運行這個閉包。我們需要把函數的參數類型指定為 () -> Void。 它的意思是“不接收參數,并且返回 Void”。在Swift中,Void是什么也沒有的意思。



          好了,讓我們來寫一個 travel() 函數,接收不同類型的 traveling 動作, 并且在動作前后分別打印信息:



          func travel(action: () -> Void) {

            print("我準備創建")

            action()

            print("我建好了")

          }



          現在可以用上 driving 閉包了,就像這樣:



          travel(action: driving)

          1

          尾隨閉包語法

          如果一個函數的最后一個參數是閉包,Swift允許你采用一種被稱為 “拖尾閉包語法” 的方式來調用這個閉包。你可以把閉包傳入函數之后的花括號里,而不必像傳入參數那樣。



          又用到我們的 travel() 函數了。它接收一個 action 閉包。閉包在兩個 print() 調用之間執行:



          func travel(action: () -> Void) {

            print("我準備創建")

            action()

            print("我建好了")

          }



          由于函數的最后一個參數是閉包,我們可以用拖尾閉包語法來調用 travel() 函數,就像這樣:



          travel() {

            print("我要創建閉包")

          }



          實際上,由于函數沒有別的參數了,我們還可以將圓括號完全移除:



          travel {

            print("我要創建閉包")

          }



          拖尾閉包語法在Swift中非常常見,所以要加深印象。



          值捕獲

          閉包可以在其被定義的上下文中捕獲常量或變量。即使定義這些常量和變量的原作用域已經不存在,閉包仍然可以在閉包函數體內引用和修改這些值。

          Swift 中,可以捕獲值的閉包的最簡單形式是嵌套函數,也就是定義在其他函數的函數體內的函數。嵌套函數可以捕獲其外部函數所有的參數以及定義的常量和變量。

          官方文檔例子:



           func makeIncrementer(forIncrement amount: Int) -> () -> Int {

               var runningTotal = 0

               func incrementer() -> Int {

                   runningTotal += amount

                  return runningTotal

               }

               return incrementer

           }

           //運行結果:

           let one = makeIncrementer(forIncrement: 10)

          print(one())  //10

          print(one())  //20



          let two = makeIncrementer(forIncrement: 10)

          print(two())  //10

          print(two())  //20



          逃逸閉包

          當一個閉包作為參數傳到一個函數中,但是這個閉包在函數返回之后才被執行,我們稱該閉包從函數中逃逸。當你定義接受閉包作為參數的函數時,你可以在參數名之前標注 @escaping,用來指明這個閉包是允許“逃逸”出這個函數的。(默認值:@noescaping)

          官方文檔例子:



          var completionHandlers: [() -> Void] = []

          func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {

              completionHandlers.append(completionHandler)

          }



          如上面例子,加入標注@escaping即可表明這個閉包是允許逃逸的



          以上就是我對Swift閉包的淺薄認知,如果有細節錯誤請指出,也可以查閱官方文檔,鏈接在下面教程更為詳細。

          就是這樣啦,愛你們么么么~~


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.sdgs6788.com

          存檔

          精品久久久久中文字幕日本| 伊人久久大香线蕉AV色婷婷色| 国产精品久久新婚兰兰| 久久亚洲精品成人AV| 久久久受www免费人成| 亚洲狠狠婷婷综合久久久久| 亚洲国产精品成人AV无码久久综合影院| 久久亚洲精品成人无码网站| av国内精品久久久久影院| 精品国产一区二区三区久久蜜臀| 精品人妻伦九区久久AAA片69| 久久亚洲精品无码播放| 久久亚洲精品成人av无码网站| 久久高潮一级毛片免费| 久久av无码专区亚洲av桃花岛| 狠狠色丁香久久婷婷综合_中| 国产精品无码久久综合| 久久婷婷国产剧情内射白浆| 伊人久久免费视频| 久久青青草原国产精品免费| 国产69精品久久久久777| 精品国产福利久久久| 97久久精品国产精品青草| 久久人人爽人人爽人人爽 | 伊人伊成久久人综合网777| 99精品伊人久久久大香线蕉| 97久久精品国产精品青草| 久久精品国产网红主播| 亚洲欧美日韩久久精品第一区| 国内精品久久久久影院老司| 久久这里只有精品视频99| 久久久久久亚洲精品无码| 香蕉久久夜色精品国产尤物| 麻豆久久久9性大片| 国产欧美久久久精品影院| 欧美伊人久久大香线蕉综合 | 伊人久久大香线蕉AV色婷婷色| 中文字幕无码久久人妻| 久久精品人人做人人爽电影| 亚洲精品美女久久777777| 精品久久久无码人妻中文字幕豆芽 |