閉包的概念和定義
一段程序代碼通常由常量轻专、變量和表達(dá)式組成,之后使用一對花括號“{}”來表示閉合并包裹著這些代碼蝴罪,由這對花括號包裹著的代碼塊就是一個(gè)閉包纵势。
{
(參數(shù)名1:參數(shù)類型,參數(shù)名2:參數(shù)類型...)->返回值類型 in
閉包函數(shù)體
return 返回值
}
不能在閉包參數(shù)中設(shè)置默認(rèn)值泽疆。
let sumFunc = {
(x:Int,y:Int)->Int
in
return x+y
}
print(sumFunc(10,20))
如果一個(gè)閉包沒有參數(shù)和返回值户矢,那么基本格式中的參數(shù)列表、返回值殉疼、in都可以省略掉梯浪,這就是最簡單的閉包
let simpleFunc = {
print("這是最簡單的閉包")
}
使用尾隨閉包
在Swift開發(fā)中,尾隨閉包是一個(gè)書寫在函數(shù)括號之后的閉包表達(dá)式瓢娜,函數(shù)支持其作為最后一個(gè)參數(shù)調(diào)用挂洛。
fun calculate(opr:String,funN:(Int,Int)->Int){
switch(opr){
case "+":
print("10+5=\(funN(10,5))")
default:
print("10-5=\(funN(10,5))")
}
}
調(diào)用calculate
calculate(opr:"+",funN:{(a:Int,b:Int)->Int in return a+b})
calculate(opr:"-",{(a:Int,b:Int)->Int in return a-b})
第一行代碼傳入funN參數(shù)比較長,為此眠砾,可以通過第2行代碼的調(diào)用方式虏劲,將小括號提前到閉包表達(dá)式前面,閉包表達(dá)式位于括號的外面褒颈,這種形式就是尾隨閉包柒巫。
注意:
要使用尾隨閉包,則閉包必須是參數(shù)列表的最后一個(gè)參數(shù)谷丸,如果不是最后一個(gè)的話吻育,是無法使用尾隨閉包寫法的。
使用閉包表達(dá)式
1.根據(jù)上下文推斷類型
{(a:Int,b:Int)->Int in
return a+b
}
Swift能夠推斷出參數(shù)a和b都是Int類型的淤井,返回值也是Int類型的布疼。
{a,b in return a+b}
eg:
fun calculate(opr:String)->(Int,Int)->Int{
var result:(Int,Int)->Int
switch(opr){
case "+":
result = {a,b in return a+b}
default:
result = {a,b in return a-b}
}
return result
}
let f1:(Int,Int)->Int = calculate(opr:"+")
print("10+5 = \(f1(10,5))")
let f2:(Int,Int)->Int = calculate(opr:"-")
print("10-5 = \(f2(10,5))")
2.單行閉包表達(dá)式可以省略return關(guān)鍵字
代碼形式如下:
{a,b in a+b}
eg:
fun calculate(our:String)->(Int,Int)->Int{
var result:(Int,Int)->Int
switch(opr){
case "+":
result = {a,b in a+b}
default:
result = {a,b in a-b}
}
}
let f1:(Int,Int)->Int = calculate(opr:"+")
print("10+5 = \(f1(10,5))")
let f2:(Int,Int)->Int = calculate(opr:"-")
print("10-5 = \(f2(10,5))")
3.參數(shù)名稱縮寫
Swift提供了參數(shù)名稱 縮寫功能。用1游两、
0指代第1個(gè)參數(shù)漩绵,
n指代第n+1個(gè)參數(shù)止吐。
fun calculate(our:String)->(Int,Int)->Int{
var result:(Int,Int)->Int
switch(opr){
case "+":
result = {$0+$1}
default:
result = {$0-$1}
}
}
let f1:(Int,Int)->Int = calculate(opr:"+")
print("10+5 = \(f1(10,5))")
let f2:(Int,Int)->Int = calculate(opr:"-")
print("10-5 = \(f2(10,5))")
4.使用閉包返回值
可以直接在表達(dá)式中使用閉包的返回值
let c1:Int = {(a:Int,b:Int)->Int in
return a+b}(10,5)
print("10+5=\(c1)")
捕獲
嵌套函數(shù)或者閉包可以在其定義的上下文中捕獲常量或者變量宝踪,即使定義的這些常量或變量的原作用域已經(jīng)不存在,仍然可以在閉包函數(shù)體內(nèi)引用和修改這些常量或變量碍扔,這種機(jī)制被稱為捕獲瘩燥。
fun makeArray()->(String)->[String]{
var array:[String] = [String]()
fun addElement(element:String)->[String]{
array.append(element)
return array
}
return addElement
}
let f1 = makeArray()
print("---f1---")
print(f1("張三"))
print(f1("李四"))
print(f1("王五"))