7.閉包
-
閉包表達(dá)式
閉包表達(dá)式一般形式: { (參數(shù)列表) -> 返回值類(lèi)型 in statements } 1.閉包常用方式 //作為非空變量 var closureName: (ParameterTypes) -> ReturnType //作為可為空變量 var closureName: ((ParameterTypes) -> ReturnType)? //作為別名 typealias ClosureType = (ParameterTypes) -> ReturnType //作為靜態(tài)變量 let closureName: ClosureType = { ... } 2.閉包普通寫(xiě)法 // 聲明一個(gè)閉包(有兩個(gè)整形參數(shù)掉房,且返回值為整形的閉包) var sumClosure:((a: Int, b: Int) -> Int) // 實(shí)現(xiàn)閉包 sumClosure = { (a: Int, b: Int) -> Int in return a + b } // 調(diào)用 let sum = sumClosure(a: 10,b: 20)print(sum) 3.閉包類(lèi)型別名寫(xiě)法 // 有參數(shù)無(wú)返回值的 typealias Myclosure1 = (String) ->Void // 有參數(shù)無(wú)返回值的 typealias Myclosure2=(String) ->String // 兩個(gè)參數(shù),一個(gè)返回值 typealias Myclosure3=(String, String)->String // 無(wú)參數(shù)咖杂,無(wú)返回值 typealias Myclosure4=()->Void // 使用如下 var closure1: Myclosure1? closure1 = { (str: String) ->Void in print(str) } closure1!("HelloWorld") 參考鏈接:https://blog.csdn.net/zgpeace/article/details/103903884
-
尾隨閉包:尾隨閉包是一個(gè)書(shū)寫(xiě)在函數(shù)圓括號(hào)之后的閉包表達(dá)式禀综,函數(shù)支持將其作為最后一個(gè)參數(shù)調(diào)?用
//帶參數(shù)與不帶參數(shù)的尾隨閉包 func someClosureWithoutArgs(closure: () -> Void) { } func someClosure(arg: String, closure: () -> Void) { } //在使?用尾隨閉包時(shí),你不用寫(xiě)出它的參數(shù)標(biāo)簽 someClosureWithoutArgs { //statements } someClosure(arg: "string") { //statements }
函數(shù)和閉包都是引用類(lèi)型:無(wú)論你將函數(shù)或閉包賦值給一個(gè)常量還是變量并鸵,你實(shí)際上都是將常量或變量的值設(shè)置為對(duì)應(yīng)函數(shù)或閉包的引用
逃逸閉包:當(dāng)一個(gè)閉包作為參數(shù)傳到一個(gè)函數(shù)中,但是這個(gè)閉包在函數(shù)返回之后才被執(zhí)行,我們稱該閉包從函數(shù)中逃逸舀瓢。當(dāng)你定義接受閉包作為參數(shù)的函數(shù)時(shí),你可以在參數(shù)名之前標(biāo)注 @escaping杠步,?來(lái)指明這個(gè)閉包是允許“逃逸”出這個(gè)函數(shù)的
自動(dòng)閉包:?動(dòng)閉包是一種?自動(dòng)創(chuàng)建的閉包氢伟,用于包裝傳遞給函數(shù)作為參數(shù)的表達(dá)式榜轿。這種閉包不接受任何參數(shù),當(dāng)它被調(diào)用的時(shí)候朵锣,會(huì)返回被包裝在其中的表達(dá)式的值谬盐。