嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

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

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 中文日韩在线| 亚洲欧洲一区二区天堂久久| 亚洲精品自在久久| 亚洲精品欧美日韩| 亚洲一区二区三区免费观看| 久久久精品一品道一区| 亚洲在线播放电影| 欧美日韩一区二区三区免费| 91久久久亚洲精品| 国产一区在线看| 午夜亚洲精品| 久久爱www| 亚洲免费精彩视频| 久久激情五月丁香伊人| 极品少妇一区二区三区精品视频| 性欧美1819性猛交| 久久久www成人免费精品| 亚洲国产美国国产综合一区二区| 久久五月婷婷丁香社区| 亚洲国产mv| 一本色道婷婷久久欧美| 欧美—级高清免费播放| 久久久久久久久久久久久久一区| 亚洲一区二区免费在线| 国产欧美亚洲一区| 免费国产自线拍一欧美视频| 亚洲精品欧美日韩专区| 免费不卡视频| 欧美一区二区三区另类 | 9i看片成人免费高清| 欧美mv日韩mv国产网站app| 亚洲美女av网站| 久久久亚洲高清| 亚洲一区在线播放| 国产午夜亚洲精品理论片色戒| 欧美在线免费一级片| 亚洲国产欧美一区二区三区久久 | 国产日产欧美一区| 久久深夜福利免费观看| 亚洲社区在线观看| 亚洲高清久久| 久久精品日产第一区二区| 亚洲视频中文| 亚洲伦理在线免费看| 91久久精品一区| 国产日韩欧美日韩大片| 久久手机免费观看| 亚洲精华国产欧美| 蜜臀av在线播放一区二区三区 | 在线中文字幕不卡| 久久影院午夜片一区| 久久精品亚洲一区二区| 午夜精品久久久久久久蜜桃app| 99re6这里只有精品视频在线观看| 在线观看成人一级片| 狠狠色伊人亚洲综合网站色| 亚洲国产精品悠悠久久琪琪| 亚洲精品影视在线观看| 一本大道久久a久久综合婷婷 | 免费久久99精品国产自在现线| 亚洲午夜黄色| 亚洲在线电影| 中文日韩电影网站| 欧美不卡高清| 国产精品视频免费观看www| 欧美成人69| 欧美激情综合| 欧美刺激午夜性久久久久久久| 欧美精品入口| 国产九九精品视频| 亚洲国产日韩欧美在线动漫| 悠悠资源网久久精品| 亚洲男人第一av网站| 免费精品视频| 亚洲欧洲午夜| 亚洲性av在线| 欧美日韩国产小视频在线观看| 欧美日韩国产成人高清视频| 国产精品家教| 国产日韩欧美精品在线| 亚洲一区二区三区精品视频| 欧美成人免费在线视频| 亚洲视频一区二区在线观看 | 久久www成人_看片免费不卡| 一本色道久久99精品综合 | 久久米奇亚洲| 欧美成人69| 欧美理论片在线观看| 在线播放国产一区中文字幕剧情欧美| 99re66热这里只有精品4| 欧美成ee人免费视频| 欧美一区二区免费| 欧美精品九九99久久| 在线看片日韩| 你懂的国产精品| 美女精品在线| 亚洲欧洲日韩女同| 久久午夜精品一区二区| 午夜精品福利一区二区三区av| 久久久久se| 精品动漫一区二区| 久久亚洲精品中文字幕冲田杏梨 | 欧美激情一区二区三区蜜桃视频| 久久久噜久噜久久综合| 一区二区高清视频在线观看| 欧美二区乱c少妇| 9久re热视频在线精品| 亚洲精品久久久久久久久久久久| 欧美精品久久久久久久久久| 亚洲精品综合精品自拍| 亚洲人www| 欧美日韩一区二区三区在线视频| 亚洲一区二区三区四区五区午夜 | 欧美福利在线| 激情视频亚洲| 亚洲欧美久久久| 亚洲欧美一区二区精品久久久| 国产欧美日韩视频| 久久久久久久一区二区| 欧美在线视频导航| 亚洲深夜福利在线| 亚洲综合国产精品| 亚洲青涩在线| 午夜精品久久久久久久99樱桃 | 欧美激情女人20p| 亚洲一区欧美二区| 久久精品国内一区二区三区| 亚洲精品视频在线观看网站| 亚洲欧美激情视频在线观看一区二区三区| 国产精品欧美久久久久无广告| 欧美jizz19hd性欧美| 国产精品欧美日韩一区二区| 欧美激情一二区| 模特精品在线| 韩日视频一区| 久久精品观看| 亚洲欧洲av一区二区| 久久这里有精品15一区二区三区 | 国产精品欧美经典| 99国产精品久久久久久久| 亚洲精品久久7777| 久久久噜噜噜久久中文字免| 久久久精品国产99久久精品芒果| 亚洲精品在线看| 亚洲午夜精品视频| 欧美日韩成人综合天天影院| 老色鬼久久亚洲一区二区 | 国产美女在线精品免费观看| 日韩一区二区电影网| 亚洲欧美日韩精品一区二区| 欧美四级在线观看| 欧美在线资源| 99精品国产在热久久婷婷| 91久久精品www人人做人人爽| 亚洲激情电影中文字幕| 亚洲精品久久久久久下一站 | 欧美日韩日韩| 欧美一区二区三区四区在线观看 | 国产精品久久久久久久久久久久久| 亚洲国产一区二区三区高清 | 国产日韩欧美夫妻视频在线观看| 一本久道久久久| 久久综合久久综合这里只有精品 | 日韩一区二区精品| 欧美色中文字幕| 欧美高清在线一区| 欧美在线影院在线视频| 亚洲精品影院| 久久综合九色综合久99| 亚洲欧美中文日韩v在线观看| 国产精品国产三级国产aⅴ浪潮| 免费视频久久| 嫩草国产精品入口| 久久黄金**| 久久在线免费视频| 亚洲综合成人在线| 亚洲午夜精品在线| 亚洲一区二区三区欧美| 亚洲日本无吗高清不卡| 美女日韩欧美| 久久综合亚洲社区| 免费欧美在线视频| 亚洲成人在线免费| 国产在线一区二区三区四区| 欧美高清在线播放| 久久久久网站| 久久久久久久999| 欧美激情1区2区| 中文精品一区二区三区| 国产美女精品视频| 欧美岛国激情| 欧美精品日韩| 欧美午夜免费影院| 国产亚洲福利| 亚洲国产精品传媒在线观看| 黄色成人在线免费| 最新高清无码专区| 亚洲无线观看| 另类成人小视频在线| 91久久精品久久国产性色也91|