Swift之閉包

一:全局函數(shù)是一個有名字但不會捕獲任何價值的閉包
嵌套函數(shù)是一個有名字并可以捕獲其封閉函數(shù)域內(nèi)值的閉包
閉包表達(dá)式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量值的匿名閉包

閉包表達(dá)式:匿名閉包

一、閉包引入
普通函數(shù)寫法

func square(num:Int)->Int{
    return num*num
}
print(square(num:3))

//閉包寫法

let fun1 = {
    (num:Int)->Int in
    return num*num
}
print(type(of:fun1))//fun1類型:(Int)->Int
print(fun1(4))

閉包表達(dá)式語法
1敷鸦、由一對{}開始和結(jié)束
2息楔、in關(guān)鍵字把閉包分為兩個部分:參數(shù)與返回值、閉包體

思考1:demo是不是一個閉包

let demo = {print("hello")}
print(type(of:demo))//()->()

思考2:寫一個閉包表達(dá)式扒披,實(shí)現(xiàn)兩數(shù)相加

let sum = {
    (num1:Int,num2:Int)->Int in
    return num1+num2
}
print(sum(3,4))

第二部分:閉包縮寫

需求:把我們的java成績放到了一個數(shù)組里值依,定義一個函數(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:省略->返回類型(自動推斷出返回值是一個Bool)

print(getScore(score:score,con:{(s:Int) in return s>40}))

省略2:省略參數(shù)類型和括號(自動推斷出類型是Int)

print(getScore(score:score,con:{s in return s>40}))

省略3:單行表達(dá)式閉包可以省略return關(guān)鍵字來

print(getScore(score:score,con:{s in s>40}))

省略4:省略參數(shù)列表定義碟案,用0,1等等指代參數(shù)愿险,同時省略in

print(getScore(score:score,con:{$0>40}))*/

第三部分:尾隨閉包
使用情景:當(dāng)閉包表達(dá)式作為最后一個參數(shù)傳遞給函數(shù)時,可以單獨(dú)提出來
問題1:尾隨指的是跟在別人后面,閉包到底跟在誰后面辆亏?-函數(shù)后面
問題2:用尾隨閉包的好處风秤?提升代碼的可讀性

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+"~~~")}

值捕獲
值捕獲:也就是空手套白狼,把別人的變量或常量拿過來用
從案例中可以看出扮叨,incrementer內(nèi)嵌函數(shù)自己沒有定義任何的變量或常量缤弦,但可以捕獲上下文
中的常量和變量,拿過來自己使用

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())

逃逸閉包
閉包要逃逸彻磁,出逃到哪里碍沐?逃到函數(shù)外使用!
需求:閉包作為一個參數(shù)傳遞一個函數(shù)衷蜓,但是這個閉包我不立馬使用累提,先把這個閉包存起來,過會再用

var recv:()->Void = {print("")}
var x = 10
//方案一:定義一個函數(shù)磁浇,接受一個普通閉包為參數(shù)
func test1(closure:()->Void){
    recv = closure //此段代碼報(bào)錯斋陪,原因是普通閉包作為參數(shù),會在函數(shù)結(jié)束之后被銷毀置吓,無法在函數(shù)外使用
}
test1{
    x=100
}
recv()

//方案二:逃逸閉包
/*
逃逸閉包特點(diǎn)如下:
1无虚、可以在函數(shù)結(jié)束后使用
2、壽命長交洗!逃逸函數(shù)聲明周期長與函數(shù)骑科,只要它的引用被其他對象持有橡淑,就不會隨著函數(shù)結(jié)束而釋放掉
3构拳、通過@escaping制定一個閉包是逃逸閉包
*/
func test2(closure:@escaping ()->Void){
    recv = closure
}
test2{
    x = 200
}
recv()
print(x)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梁棠,隨后出現(xiàn)的幾起案子置森,更是在濱河造成了極大的恐慌,老刑警劉巖符糊,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凫海,死亡現(xiàn)場離奇詭異,居然都是意外死亡男娄,警方通過查閱死者的電腦和手機(jī)行贪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來模闲,“玉大人建瘫,你說我怎么就攤上這事∈郏” “怎么了啰脚?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長实夹。 經(jīng)常有香客問我橄浓,道長粒梦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任荸实,我火速辦了婚禮匀们,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘准给。我一直安慰自己昼蛀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布圆存。 她就那樣靜靜地躺著叼旋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沦辙。 梳的紋絲不亂的頭發(fā)上夫植,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音油讯,去河邊找鬼详民。 笑死,一個胖子當(dāng)著我的面吹牛陌兑,可吹牛的內(nèi)容都是我干的沈跨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼兔综,長吁一口氣:“原來是場噩夢啊……” “哼饿凛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起软驰,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涧窒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锭亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纠吴,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年慧瘤,在試婚紗的時候發(fā)現(xiàn)自己被綠了戴已。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡锅减,死狀恐怖糖儡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情上煤,我是刑警寧澤休玩,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響拴疤,放射性物質(zhì)發(fā)生泄漏永部。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一呐矾、第九天 我趴在偏房一處隱蔽的房頂上張望苔埋。 院中可真熱鬧,春花似錦蜒犯、人聲如沸组橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玉工。三九已至,卻和暖如春淘菩,著一層夾襖步出監(jiān)牢的瞬間遵班,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工潮改, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狭郑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓汇在,卻偏偏與公主長得像翰萨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糕殉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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