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

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
国产精品91在线观看| 91精品久久久久久久久久另类| 日韩视频欧美视频| 亚洲第一精品福利| 国产综合久久久久久| 日韩精品亚洲精品| 欧美人成在线视频| 欧美一级成年大片在线观看| 95av在线视频| 成人国产在线视频| 夜夜嗨av色一区二区不卡| 国产色婷婷国产综合在线理论片a| 亚洲第五色综合网| 欧美国产日韩一区二区在线观看| 亚洲精品有码在线| 亚洲第一av在线| 97在线观看视频| 国产精品久久久久久久久免费| 91sao在线观看国产| 国产精品一久久香蕉国产线看观看| 国产精品无av码在线观看| 亚洲精品视频网上网址在线观看| 成人精品网站在线观看| 欧美日本高清视频| 国产亚洲美女精品久久久| 性色av一区二区三区免费| 日韩欧美精品中文字幕| 97国产真实伦对白精彩视频8| 精品国产一区二区三区久久狼黑人| 亚洲社区在线观看| 国产日韩欧美电影在线观看| 欧美一级免费视频| 欧美中文字幕视频| 国产一区av在线| 蜜臀久久99精品久久久久久宅男| 国产精品中文字幕在线| 91高清在线免费观看| 青青在线视频一区二区三区| 国产精品极品在线| 日韩在线视频播放| 26uuu亚洲伊人春色| 国产欧美日韩亚洲精品| 中文字幕精品网| 成人在线视频福利| 尤物99国产成人精品视频| 亚洲第一精品夜夜躁人人爽| 久久91亚洲人成电影网站| 蜜月aⅴ免费一区二区三区| 国产情人节一区| 日韩一二三在线视频播| 亚洲一区二区自拍| 91国偷自产一区二区三区的观看方式| 欧美日韩成人黄色| 日韩av在线免费观看一区| 日本19禁啪啪免费观看www| 亚洲欧美中文日韩在线v日本| 日韩在线小视频| 国产精品jvid在线观看蜜臀| 日本中文字幕成人| 亚洲国产天堂网精品网站| 美女视频黄免费的亚洲男人天堂| 日韩在线视频免费观看| 日韩动漫免费观看电视剧高清| 欧美中文字幕视频在线观看| 日本国产精品视频| 久久精品在线视频| 97精品欧美一区二区三区| 亚洲女人天堂视频| 亚州精品天堂中文字幕| 国产在线观看精品一区二区三区| 综合网日日天干夜夜久久| 久久在线免费观看视频| 亚洲欧美变态国产另类| 国产精品一区二区av影院萌芽| 国产91精品最新在线播放| 色综合亚洲精品激情狠狠| 久久精品国产亚洲精品2020| 日韩女优人人人人射在线视频| 亚洲黄色av女优在线观看| 日韩成人激情视频| 精品久久久久久国产91| 91在线观看免费| 欧美成人免费大片| 精品中文字幕在线观看| 亚洲男人天堂久| 在线看福利67194| 欧美极品少妇xxxxx| 在线观看久久久久久| 欧美精品久久久久| 亚洲自拍偷拍色片视频| 午夜精品视频在线| 日本高清久久天堂| 91在线免费网站| 国产亚洲欧美一区| 欧美激情按摩在线| 日韩一区二区在线视频| 精品国产一区二区三区久久久| 国产成人精品综合久久久| 欧美亚洲免费电影| 久久久久久久久久久av| 2019中文字幕全在线观看| 精品欧美一区二区三区| 欧美国产日韩xxxxx| 日韩av不卡电影| 欧美噜噜久久久xxx| 国产97色在线|日韩| 欧美色道久久88综合亚洲精品| 亚洲人av在线影院| 日韩动漫免费观看电视剧高清| 国产亚洲精品久久久优势| 91国自产精品中文字幕亚洲| 亚洲综合自拍一区| 不卡av日日日| 亚洲天堂网在线观看| 欧洲精品在线视频| 97色在线观看| 亚洲香蕉成视频在线观看| 欧美电影在线观看网站| 国产成人福利夜色影视| 亚洲欧美日韩中文在线制服| 欧美裸体xxxxx| 欧美日韩精品二区| 宅男66日本亚洲欧美视频| 国产成人极品视频| 欧美疯狂xxxx大交乱88av| 伊人久久男人天堂| 欧美高清第一页| 欧美日韩在线视频一区二区| 亚洲成人av资源网| 超碰91人人草人人干| 亚洲丁香婷深爱综合| 欧美日韩亚洲精品内裤| 日韩免费看的电影电视剧大全| 日韩视频免费看| 亚洲美女自拍视频| 国产精品永久免费在线| 91欧美精品午夜性色福利在线| 国产综合视频在线观看| 三级精品视频久久久久| 国产精品久久久久77777| 精品视频久久久| 久久青草福利网站| 97人洗澡人人免费公开视频碰碰碰| 欧美成人午夜激情| 国产精品色午夜在线观看| 国产精品高潮在线| 91精品国产电影| 蜜臀久久99精品久久久久久宅男| 亚洲黄页网在线观看| 亚洲аv电影天堂网| 热久久美女精品天天吊色| 欧美日韩午夜剧场| 日韩女优人人人人射在线视频| 国产一区欧美二区三区| 国产91露脸中文字幕在线| 91国产一区在线| 亚洲精品在线观看www| 久久久噜噜噜久噜久久| 97精品久久久中文字幕免费| 国产精品丝袜一区二区三区| 国产视频久久久久| 欧洲日韩成人av| 狠狠躁18三区二区一区| 国产精品男女猛烈高潮激情|