閉包表達(dá)式語(yǔ)法
閉包表達(dá)式語(yǔ)法有如下的一般形式:
- 1
{ (parameters) -> (return type) in
statements
}
parameters--形式參數(shù)類(lèi)型
type -- 返回值類(lèi)型
statements -- 函數(shù)體
例如:
let bibao = {( num :Int , num1:Int) -> Int in
return num + num1
}
let get1 = bibao(20,30)
print("bibao de jieguo \(get1)")
輸出結(jié)果:bibao de jieguo 50
- 2
//模式2 用一行書(shū)寫(xiě)
let bibao = {( num :Int , num1:Int) -> Int in return num + num1}
- 3
//模式3 省略 形式參數(shù)類(lèi)型,只使用返回值類(lèi)型
let bibao = {num , num1 -> Int in return num + num1
}
捕獲值
一個(gè)閉包能夠從上下文捕獲已被定義的常量和變量。即使定義這些常量和變量的原作用域已經(jīng)不存在,閉包仍能夠在其函數(shù)體內(nèi)引用和修改這些值。
func bibao2 (number num3:Int,number11 num4:Int) -> () -> Int{
var num5 = 4;
func add() -> Int{
num5 += num4;
num5+=num3
return num5
}
return add
}
let get2 = bibao2(number: 5,number11: 100)
print(get2())
輸出結(jié)果:109
分析:定義閉包bibao2,包含一個(gè)內(nèi)嵌函數(shù),可以捕獲上文的傳入?yún)?shù)num3,num4及內(nèi)部定義變量num5, 返回add 作為一個(gè)閉包,bibao2的返回類(lèi)型是() -> Int,說(shuō)明返回的是一個(gè)函數(shù),不需要任何形式參數(shù),每次調(diào)用返回一個(gè)返回值為Int類(lèi)型的函數(shù),賦值給get2,最后調(diào)用get2(),即內(nèi)部函數(shù)add(),得到函數(shù)調(diào)用的結(jié)果
如果打印三次:print(get2())
結(jié)果: 109 214 319
說(shuō)明每次都捕獲了上下文常亮
如果這是個(gè)定義了get3;
let get3 = bibao2(number: 10,number11: 10)
print(get3())
輸出結(jié)果:24
說(shuō)明新的閉包實(shí)例,回創(chuàng)建新的獨(dú)立的num5,閉包和實(shí)例之間建立一個(gè)強(qiáng)引用環(huán)
自動(dòng)閉包
var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
print(customersInLine.count)
// Prints "5"
let customerProvider = { customersInLine.remove(at: 0) }
print(customersInLine.count)
// Prints "5"
print("Now serving \(customerProvider())!")
// Prints "Now serving Chris!"
print(customersInLine.count)
// Prints "4"
盡管 customersInLine 數(shù)組的第一個(gè)元素以閉包的一部分被移除了,但任務(wù)并沒(méi)有執(zhí)行直到閉包被實(shí)際調(diào)用。
如果閉包永遠(yuǎn)不被調(diào)用,那么閉包里邊的表達(dá)式就永遠(yuǎn)不會(huì)求值。注意 customerProvider 的類(lèi)型不是 String 而是 () -> String ——一個(gè)不接受實(shí)際參數(shù)并且返回一個(gè)字符串的函數(shù)
同理
當(dāng)你傳一個(gè)閉包作為實(shí)際參數(shù)到函數(shù)的時(shí)候,你會(huì)得到與延遲處理相同的行為。
// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: () -> String) {
print("Now serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } )
// Prints "Now serving Alex!"
傳遞一個(gè)形式參數(shù)為customer,類(lèi)型為函數(shù)() 的函數(shù){ customersInLine.remove(at: 0) }作為實(shí)際參數(shù)給save函數(shù),返回一個(gè)字符串