原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:關(guān)東升的博客
我給Swift 中的閉包一個(gè)定義:閉包是自包含的匿名函數(shù)代碼塊,可以作為表達(dá)式、函數(shù)參數(shù)和函數(shù)返回值,閉包表達(dá)式的運(yùn)算結(jié)果是一種函數(shù)類型。
Swift中的閉包類似于Objective-C 中的代碼塊、Java中的匿名內(nèi)部類。
使用閉包表達(dá)式
Swift中的閉包表達(dá)式很靈活,其標(biāo)準(zhǔn)語法格式如下:
{ (參數(shù)列表) ->返回值類型 in
語句組
}
其中,參數(shù)列表與函數(shù)中的參數(shù)列表形式一樣,返回值類型類似于函數(shù)中的返回值類型,但不同的是后面有in關(guān)鍵字。
Swift提供了多種閉包簡(jiǎn)化寫法,我來介紹下面幾種不同形式:
1、類型推斷簡(jiǎn)化
類型推斷是Swift的強(qiáng)項(xiàng),Swift可以根據(jù)上下文環(huán)境推斷出參數(shù)類型和返回值類型。以下代碼是標(biāo)準(zhǔn)形式的閉包:
{(a:Int, b:Int) -> Int in
return a + b
}
Swift能推斷出參數(shù)a和b是Int類型,返回值也是Int類型。簡(jiǎn)化形式如下:
{(a, b) in return a + b }
{a, b in return a + b } //參數(shù)列表括號(hào)也可以省略
2、隱藏return關(guān)鍵字
在閉包內(nèi)部語句組只有一條語句,如return a + b等,那么這種語句都是返回語句。前面的關(guān)鍵字return可以省略,省略形式如下:
{a, b in a + b }
使用這種簡(jiǎn)化方式修改后的示例代碼如下:
func calculate(opr :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (opr) {
case "+" :
result = {a, b in a + b } //return關(guān)鍵字省略了
default:
result = {a, b in a - b } //return關(guān)鍵字省略了
}
return result
}
省略的前提是閉包中只有一條return語句。
3、省略參數(shù)名稱
Swift提供了參數(shù)名省略功能,我們可以用$0、$1、$2…來指定閉包中參數(shù),$0指代第一個(gè)參數(shù),$1指代第二個(gè)參數(shù),$2指代第三個(gè)參數(shù),以此類推$n+1指代第n個(gè)參數(shù)。
使用參數(shù)名省略功能,在閉包中必須省略參數(shù)列表定義,Swift能夠推斷出這些縮寫參數(shù)的類型。參數(shù)列表省略了,in關(guān)鍵字也需要省略。參數(shù)名省略之后如下所示:
{$0 + $1}
使用參數(shù)名省略后的示例代碼如下:
func calculate(opr :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (opr) {
case "+" :
result = {$0 + $1} //采用了參數(shù)名省略
default:
result = {$0 - $1} //采用了參數(shù)名省略
}
return result
}
let f1:(Int,Int)-> Int = calculate("+")
print("10 + 5 = \(f1(10,5))")
let f2:(Int,Int)-> Int = calculate("-")
print("10 - 5 = \(f2(10,5))")
4、使用閉包返回值
閉包表達(dá)本質(zhì)上是函數(shù)類型,是有返回值的,我們可以直接在表達(dá)式中使用閉包的返回值。重新修改add和sub閉包,示例代碼如下:
let c1:Int = {(a:Int, b:Int) -> Int in
return a + b
}(10,5)
print("10 + 5 = \(c1)")
解釋:給c1賦值,后面是一個(gè)閉包表達(dá)式。但是閉包表達(dá)式不能直接賦值給c1,因?yàn)閏1是Int類型,需要閉包的返回值。這就需要在閉包結(jié)尾的大括號(hào)后面接一對(duì)小括號(hào)(10,5),通過小括號(hào)(10,5)為閉包傳遞參數(shù)。