Swift之閉包

閉包:是自包含的功能代碼塊享潜,可以在代碼中使用或者用來作為參數(shù)傳值

Swift 中的閉包與 C 和 Objective-C 中的代碼塊以及其他一些編程語言中的匿名函數(shù)比較相似

全局函數(shù)和嵌套函數(shù)其實(shí)就是特殊的閉包
*全局函數(shù):有名字但不能捕獲任何值
*嵌套函數(shù):有名字珊膜,也能捕獲封閉函數(shù)內(nèi)的值
*閉包表達(dá)式:無名閉包堵幽,使用輕量級(jí)語法,可以根據(jù)上下文環(huán)境捕獲值

一骄瓣、閉包引入

普通函數(shù)寫法
func square(num:Int)->Int{
return numnum
}
print(square(num:3))
閉包寫法
let fun1 = {
(num:Int)->Int in
return num
num
}
print(type(of:fun1))//fun1類型:(Int) -> Int
print(fun1(4))
閉包表達(dá)式:是一種利用簡潔語法構(gòu)建內(nèi)聯(lián)閉包的方式求泰。 閉包表達(dá)式提供了一些語法優(yōu)化备畦,使得撰寫閉包變得簡單明了
1、由一對(duì){}開始和結(jié)束
2仁期、in關(guān)鍵字把閉包分成兩部分:參數(shù)與返回值桑驱、閉包體

二竭恬、閉包縮寫

func getScore(score:[Int],con:(Int)->Bool)->[Int]{
var newScore = Int
for item in score{
if con(item){
newScore.append(item)
}
}
return newScore
}
var score = [66,89,80,33,100]
print(getScore(score:score,con:{(s:Int)->Bool in return s>40}))
省略1:省略->返回類型(自動(dòng)推斷出返回值是一個(gè)Bool)
print(getScore(score:score,con:{(s:Int) in return s>40}))
省略2:省略參數(shù)類型和括號(hào)(自動(dòng)推斷出參數(shù)類型是Int)
print(getScore(score:score,con:{s in return s>40}))
省略3:單行表達(dá)式閉包可以省略 return 關(guān)鍵字來
print(getScore(score:score,con:{0>40})) 省略4:省略參數(shù)列表定義,用0,1等等指代參數(shù)熬的,同時(shí)省略in print(getScore(score:score,con:{0>40}))

三痊硕、尾隨閉包

尾隨閉包是一個(gè)書寫在函數(shù)括號(hào)之后的閉包表達(dá)式,函數(shù)支持將其作為最后一個(gè)參數(shù)調(diào)用
func printInfo(info:String,printFun:(String)->Void){
printFun(info)
}
//普通調(diào)用方式
printInfo(info:"hello world",printFun:{s in print(s+"~~~")})
//使用尾隨閉包進(jìn)行調(diào)用
printInfo(info:"hello world"){s in print(s+"~~~")}

值捕獲

閉包可以在其定義的上下文中捕獲常量或變量
即使定義這些常量和變量的原域已經(jīng)不存在押框,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值
Swift最簡單的閉包形式是嵌套函數(shù)岔绸,也就是定義在其他函數(shù)的函數(shù)體內(nèi)的函數(shù)
嵌套函數(shù)可以捕獲其外部函數(shù)所有的參數(shù)以及定義的常量和變量
看這個(gè)例子:
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
let a = makeIncrementer(forIncrement:10)
print(a())

閉包是引用類型

let b = a
print(b()) //輸出結(jié)果為20
let c = makeIncrementer(forIncrement:10)
print(c())

逃逸閉包

ar recv:()->Void = {print("")}
var x = 10
//方案一:定義一個(gè)函數(shù),接受一個(gè)普通閉包為參數(shù)
func test1(closure:()->Void){
recv = closure //此段代碼報(bào)錯(cuò)橡伞,原因是普通閉包作為參數(shù)盒揉,會(huì)在函數(shù)結(jié)束之后被銷毀,無法在函數(shù)外使用兑徘。
}
test1{
x=100
}
recv()

// 方案二:逃逸閉包

逃逸閉包特點(diǎn)如下:
1刚盈、可以在函數(shù)結(jié)束后使用;
2挂脑、壽命長藕漱!逃逸閉包聲明周期長于函數(shù),只要它的引用被其他對(duì)象持有崭闲,就不會(huì)隨著函數(shù)結(jié)束而釋放掉
3肋联、通過@escaping 指定一個(gè)閉包是逃逸閉包

func test2(closure:@escaping ()->Void){
recv = closure
}
test2{
x = 200
}
recv()
print(x)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市镀脂,隨后出現(xiàn)的幾起案子牺蹄,更是在濱河造成了極大的恐慌,老刑警劉巖薄翅,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沙兰,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坦仍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門罢防,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斋射,你說我怎么就攤上這事〉纾” “怎么了罗岖?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腹躁。 經(jīng)常有香客問我桑包,道長,這世上最難降的妖魔是什么纺非? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任哑了,我火速辦了婚禮赘方,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弱左。我一直安慰自己窄陡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布拆火。 她就那樣靜靜地躺著跳夭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榜掌。 梳的紋絲不亂的頭發(fā)上优妙,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音憎账,去河邊找鬼套硼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胞皱,可吹牛的內(nèi)容都是我干的邪意。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼反砌,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼雾鬼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宴树,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤策菜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后酒贬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體又憨,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年锭吨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蠢莺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡零如,死狀恐怖躏将,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情考蕾,我是刑警寧澤祸憋,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肖卧,受9級(jí)特大地震影響夺衍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喜命,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一沟沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壁榕,春花似錦矛紫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牡辽,卻和暖如春喳篇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背态辛。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工麸澜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奏黑。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓炊邦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熟史。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馁害,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 閉包 閉包類似于 OC 的 block,但是比 OC 的 block 應(yīng)用面更廣 在 OC 中 block 是匿名...
    freemanIT閱讀 444評(píng)論 0 0
  • 閉包 閉包是自包含的函數(shù)代碼塊蹂匹,可以在代碼中被傳遞和使用碘菜。閉包可以捕獲和存儲(chǔ)其所在上下文中任意常量和變量的引用。被...
    迷兔兔_閱讀 153評(píng)論 0 0
  • Swfit的學(xué)習(xí)大致有幾個(gè)重點(diǎn):元組限寞,可選興忍啸,函數(shù),閉包這些是較之OC有很大不同的地方昆烁,學(xué)會(huì)了這些swift也算是...
    清歡渡_13b4閱讀 68評(píng)論 0 0
  • 根據(jù)官方文檔閉包是自包含的功能代碼塊吊骤,可以在代碼中使用或者用來作為參數(shù)傳值。Swift 中的閉包與 C 和 Obj...
    Mrs高_(dá)9135閱讀 155評(píng)論 0 0
  • 要說最近小編朋友圈最火的是誰?那絕對(duì)是朱一龍無疑了鼠渺!朱一龍?jiān)阪?zhèn)魂中飾演的是沈巍鸭巴,簡直帥到爆炸!演技也是超棒拦盹,圈粉無...
    傳媒矩陣閱讀 255評(píng)論 1 3