国产69囗曝吞精在线视频,肥臀浪妇太爽了快点再快点,亚洲欧洲成人a∨在线观看,狠狠色丁香久久综合 ,国精一二二产品无人区免费应用,亚洲精品久久久久中文字幕,四虎一区二区成人免费影院网址 ,无码三级中文字幕在线观看

      Swift 閉包簡單使用

      2020-3-30    seo達人

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

      Swift閉包

      閉包的形式

      Swift中的閉包有很多優(yōu)化的地方

      創(chuàng)建基本的閉包

      在閉包中接收參數(shù)

      從閉包中返回值

      閉包作為參數(shù)

      尾隨閉包語法

      值捕獲

      逃逸閉包

      閉包的形式

      全局函數(shù) 嵌套函數(shù) 閉包表達式

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

      Swift中的閉包有很多優(yōu)化的地方

      根據上下文推斷參數(shù)和返回值類型



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



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



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



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



      創(chuàng)建基本的閉包

      let bibao = {

        print("我要創(chuàng)建閉包")

      }



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



      bibao()



      在閉包中接收參數(shù)

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



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



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



      let bibao= { (bao1: String) in

        print("我要創(chuàng)建 (bao1)。")

      }



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



      bibao("閉包")



      從閉包中返回值

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



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



      let bibao= { (bao1: String) in

        print("我要創(chuàng)建  (bao1)。")

      }



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



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

        return "我要創(chuàng)建 (bao1)。"

      }



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



      let message = drivingWithReturn("閉包")

      print(message)



      閉包作為參數(shù)

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



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



      let driving = {

        print("我正在創(chuàng)建")

      }



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



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



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

        print("我準備創(chuàng)建")

        action()

        print("我建好了")

      }



      現(xiàn)在可以用上 driving 閉包了,就像這樣:



      travel(action: driving)

      1

      尾隨閉包語法

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



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



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

        print("我準備創(chuàng)建")

        action()

        print("我建好了")

      }



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



      travel() {

        print("我要創(chuàng)建閉包")

      }



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



      travel {

        print("我要創(chuàng)建閉包")

      }



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



      值捕獲

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

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

      官方文檔例子:



       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



      逃逸閉包

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

      官方文檔例子:



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

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

          completionHandlers.append(completionHandler)

      }



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



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

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


      日歷

      鏈接

      個人資料

      藍藍設計的小編 http://m.izc.net.cn

      存檔

      主站蜘蛛池模板: 成人高清无遮挡免费视频在线观看| 欧美a级在线| 国产精品自产拍在线观看 | 精品无码人妻一区二区三| 免费无码又爽又刺激软件下载直播 | 可以免费看黄的网站| 亚洲欧美精品一区二区三区| 狠狠色噜噜狠狠狠狠7777米奇| а√天堂www在线а√天堂视频| 中文字幕永久在线观看| jizz国产免费观看| 国产精品视频露脸| 87福利视频| 免费看a网站| 久久人人爽人人爽人人片av| 亚洲国产成人无码影片在线播放| 91精品人妻一区二区三区| 亚洲国产精品综合久久20| 小罗莉极品一线天在线| 99精品在线| 香蕉污视频在线观看| 清纯小美女主播流白浆| 国产色精品vr一区二区| 久久精品一区二区免费播放| 奇米精品一区二区三区四区| 精品久久无码中文字幕| 久久精品熟女人妻一区二区三区| 久久乐av| 羞羞影院午夜男女爽爽免费视频| 日韩精品无码一区二区视频| 午夜成人免费电影| 性爱免费在线视频| 天堂中文最新版在线中文| 亚洲国产精品无码中文字| 手机在线免费av| 中国色视频| 国产乱码精品一区二区三区四川人 | 国产中文字幕精品| 18禁黄网站禁片免费观看| 国产精品嫩草99av在线| 免费一级片在线观看|