• <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <small id="ggggg"></small> <sup id="ggggg"></sup>
    <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <tfoot id="ggggg"></tfoot>
  • <nav id="ggggg"><cite id="ggggg"></cite></nav>
    <nav id="ggggg"></nav>
    成人黃色A片免费看三更小说,精品人妻av区波多野结衣,亚洲第一极品精品无码,欧美综合区自拍亚洲综合,久久99青青精品免费观看,中文字幕在线中字日韩 ,亚洲国产精品18久久久久久,黄色在线免费观看

    Swift 閉包簡(jiǎn)單使用

    2020-3-30    seo達(dá)人

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

    Swift閉包

    閉包的形式

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

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

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

    從閉包中返回值

    閉包作為參數(shù)

    尾隨閉包語(yǔ)法

    值捕獲

    逃逸閉包

    閉包的形式

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

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

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

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



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



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



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



    閉包是引用類型:無(wú)論你將函數(shù)或閉包賦值給一個(gè)常量還是變量,你實(shí)際上都是將常量或變量的值設(shè)置為對(duì)應(yīng)函數(shù)或閉包的引用



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

    let bibao = {

      print("我要?jiǎng)?chuàng)建閉包")

    }



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



    bibao()



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

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



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



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



    let bibao= { (bao1: String) in

      print("我要?jiǎng)?chuàng)建 (bao1)。")

    }



    函數(shù)和閉包的一個(gè)區(qū)別是運(yùn)行閉包的時(shí)候你不會(huì)用到參數(shù)標(biāo)簽。因此,調(diào)用 driving() 的時(shí)候,我們是這樣寫的:



    bibao("閉包")



    從閉包中返回值

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



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



    let bibao= { (bao1: String) in

      print("我要?jiǎng)?chuàng)建  (bao1)。")

    }



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



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

      return "我要?jiǎng)?chuàng)建 (bao1)。"

    }



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



    let message = drivingWithReturn("閉包")

    print(message)



    閉包作為參數(shù)

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



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



    let driving = {

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

    }



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



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



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

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

      action()

      print("我建好了")

    }



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



    travel(action: driving)

    1

    尾隨閉包語(yǔ)法

    如果一個(gè)函數(shù)的最后一個(gè)參數(shù)是閉包,Swift允許你采用一種被稱為 “拖尾閉包語(yǔ)法” 的方式來(lái)調(diào)用這個(gè)閉包。你可以把閉包傳入函數(shù)之后的花括號(hào)里,而不必像傳入?yún)?shù)那樣。



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



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

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

      action()

      print("我建好了")

    }



    由于函數(shù)的最后一個(gè)參數(shù)是閉包,我們可以用拖尾閉包語(yǔ)法來(lái)調(diào)用 travel() 函數(shù),就像這樣:



    travel() {

      print("我要?jiǎng)?chuàng)建閉包")

    }



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



    travel {

      print("我要?jiǎng)?chuàng)建閉包")

    }



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



    值捕獲

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

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

    官方文檔例子:



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

         var runningTotal = 0

         func incrementer() -> Int {

             runningTotal += amount

            return runningTotal

         }

         return incrementer

     }

     //運(yùn)行結(jié)果:

     let one = makeIncrementer(forIncrement: 10)

    print(one())  //10

    print(one())  //20



    let two = makeIncrementer(forIncrement: 10)

    print(two())  //10

    print(two())  //20



    逃逸閉包

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

    官方文檔例子:



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

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

        completionHandlers.append(completionHandler)

    }



    如上面例子,加入標(biāo)注@escaping即可表明這個(gè)閉包是允許逃逸的



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

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


    日歷

    鏈接

    個(gè)人資料

    存檔

    主站蜘蛛池模板: 手机看片福利一区二区三区| 国产一级做a爱视频在线| 中文精品无码中文字幕无码专区 | 久久青青草原精品国产麻豆| 华蓥市| 国产精品片211在线观看| av狼友| 男人资源最新资源网站| 亚洲国产综合有精品| 亚洲一区二区无码视频| 最近最新中文字幕视频| 日韩女优一区二区视频| 成年男人裸j照无遮挡无码 | 欧美性受XXXX黑人猛交| 佛坪县| 欧美日韩中文国产va另类| 久久机热一这里只精品| 色婷婷一区二区三区四区| www免费视频com| 亚洲永久精品一区二区三区| 成人午夜影院| 亚洲中文字幕无码乱线久久视| 日韩AV无码社区一区二区三区| 99久久精品久久久久久清纯| 深夜av在线免费观看| 毛片一区二区在线看| 在线a视频网站| 一区二区三区毛片无码| 久久熟女五十路一区二区| 亚洲成AV人片在线观看天堂无| 久久久久人妻精品一区三寸蜜桃 | 久久狼人国产综合精品| 2022Av天堂在线无码| 国产91在线|亚洲| 欧美激情精品久久999| 人妻夜夜爽天天爽三区| 在线观看国产精美视频| 国产精品亚洲精品日韩动图| 国产人妖在线| 亚洲国产av系列精品麻豆| 日本卡2卡3卡4卡5卡精品视频|