92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

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://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
黄色网址在线免费| 久久久精品一区二区| 亚洲高清不卡| 蜜桃传媒视频麻豆一区| 亚洲在线免费视频| 不用播放器成人网| 日本10禁啪啪无遮挡免费一区二区| 成人激情在线播放| 国产精品三上| 国产二区三区在线| 国产乱人伦偷精品视频免下载| 国产精品久久观看| xx视频.9999.com| 国产调教精品| 老鸭窝91久久精品色噜噜导演| 国产福利视频在线| 黄视频网站在线看| 欧美一区二视频在线免费观看| 国产精品免费网站| 欧美理论影院| 国产精品99免视看9| 欧美亚洲精品在线| 狠狠色综合网站久久久久久久| 综合久久给合久久狠狠狠97色| 亚洲第一av色| 中文字幕一区二区三区不卡在线| 欧美国产中文字幕| 992tv在线成人免费观看| 亚洲精品久久久| 一区二区三区在线高清| 亚洲三级电影全部在线观看高清| 亚洲精品一线二线三线无人区| 午夜免费在线观看精品视频| 国产suv精品一区二区| 欧美插天视频在线播放| 国产又色又爽又黄刺激在线视频| 日本丰满少妇一区二区三区| 欧美日韩综合视频| 欧美日韩电影在线播放| 在线播放视频一区| 日韩国产在线观看| 粉嫩aⅴ一区二区三区四区五区| 日韩av电影免费观看高清| 亚洲乱码国产乱码精品精可以看| 久久精品国内一区二区三区水蜜桃| 久久免费精品国产久精品久久久久| 欧美贵妇videos办公室| 色综合久久中文| 日韩av影视| 国产亚洲精品一区二555| 日韩精品二区| 999日本视频| 亚洲丰满少妇videoshd| 国产欧美日韩视频在线观看| 欧美韩国日本精品一区二区三区| www.亚洲激情.com| 国产精品日韩久久久久| 国产91精品久久久| 精品999成人| 一区二区三区日本| 四虎永久在线精品免费一区二区| 欧美黄色激情| 欧美成人免费在线视频| 亚洲免费av网址| 麻豆成人91精品二区三区| 蘑菇福利视频一区播放| 久久野战av| 66m—66摸成人免费视频| 亚洲欧美在线网| 亚洲精品综合精品自拍| 国产精品yjizz| 欧美电影免费观看完整版| 日韩电影av| 一本一本久久| 亚洲四虎影院| 亚洲自拍欧美另类| 国产精品一区二区不卡视频| 国产精品久久久久av蜜臀| 国产va免费精品观看精品视频| 日韩成人精品| 麻豆国产一区二区三区四区| 社区色欧美激情 | 欧美极品xxx| 99久久久国产精品免费蜜臀| 国产一区二区在线观看免费播放| 成人女保姆的销魂服务| 亚洲视频视频在线| 亚洲三级网址| 日韩久久综合| 国产精品美日韩| 国产精品久久久久一区二区三区| 欧美成人手机在线| 国产精品主播直播| 午夜视频在线观看免费视频| 国产电影一区二区在线观看| 日本道在线观看一区二区| 日韩一级片网站| 成人毛片老司机大片| 欧美日日夜夜| 国产精品青草综合久久久久99| 国产成人精品一区| 日韩一区二区电影| 成人免费视频网站| 国产精品二区一区二区aⅴ污介绍| 国产精品高潮视频| 蜜臂av日日欢夜夜爽一区| 国产精品对白一区二区三区| 日韩精品欧美| 超碰aⅴ人人做人人爽欧美| 在线观看网站黄不卡| 337p日本欧洲亚洲大胆鲁鲁| 欧美日韩精品一区二区三区视频| 国产精品99久久久久久久久久久久| 日韩精品免费一区二区夜夜嗨| 久久爱另类一区二区小说| 亚洲xxxx3d| 国产三级久久久| 68国产成人综合久久精品| 日韩午夜免费视频| 国产精品亲子伦av一区二区三区| 日韩午夜中文字幕| 中文字幕日本在线| 日韩精品一区二区在线| 久久精品国产999大香线蕉| 亚洲同性同志一二三专区| 丝袜亚洲另类丝袜在线| 中文字幕色av一区二区三区| 久久av一区二区三区| 久久久久久亚洲精品杨幂换脸| 色综合久久久久久中文网| 男女羞羞视频在线观看| 国产精品久久久对白| 五月天丁香综合久久国产| 亚洲а∨天堂久久精品喷水| 污视频网站免费在线观看| 亚洲综合精品四区| 8v天堂国产在线一区二区| 国产欧美一区二区三区在线老狼| 亚洲国产成人tv| 亚洲成人性视频| 欧美精品一二区| 在线播放91灌醉迷j高跟美女| 亚洲男人天堂网站| 国产成人亚洲一区二区三区| 日韩午夜免费视频| 日韩精品成人在线观看| 成人欧美一区二区三区视频| 欧美粗大gay| 免费超碰在线| 欧美剧情电影在线观看完整版免费励志电影| 亚洲一本二本| 日韩不卡在线视频| 欧美亚洲视频一区二区| 国产一区二区三区在线视频| 99久久99久久精品免费观看| 国产成人av网| 精品粉嫩aⅴ一区二区三区四区| 在线一区视频观看| 国产乱论精品| 国产h片在线观看| 国产美女在线观看一区| 99久久精品网站| 性欧美精品高清| 亚洲片在线资源|