Swift使用閉包表達式
Swift中的閉包表達式很靈活,其標準語法格式如下:{ (參數列表) ->返回值類型 in
語句組
}
其中,參數列表與函數中的參數列表形式一樣,返回值類型類似於函數中的返回值類型,但不同的是後麵有in關鍵字。
Swift提供了多種閉包簡化寫法,這一節我們將介紹幾種不同的形式。
1.類型推斷簡化
類型推斷是Swift的強項,Swift可以根據上下文環境推斷出參數類型和返回值類型。以下代碼是標準形式的閉包:
{(a:Int, b:Int) -> Int in
return a + b
}
Swift能推斷出參數a和b是Int類型,返回值也是Int類型。簡化形式如下:
{a, b in return a + b }
使用這種簡化方式修改後的示例代碼如下:
func 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("+") println("10 + 5 = \(f1(10,5))") let f2:(Int,Int)-> Int = calculate("-") println("10 + 5 = \(f2(10,5))")
上述代碼第①行和第②行的閉包是上一節示例的簡化寫法,其中a和b是參數,return後麵是返回值。怎麼樣?很簡單吧?
2.隱藏return關鍵字
如果在閉包內部語句組隻有一條語句,如return a + b等,那麼這種語句都是返回語句。前麵的關鍵字return可以省略,省略形式如下:
{a, b in a + b }
使用這種簡化方式修改後的示例代碼如下:
func 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; }
上述代碼第①行和第②行的閉包return關鍵字省略了,需要注意的是,省略的前提是閉包中隻有一條return語句。下麵這樣有多條語句是不允許的。
{a, b in var c; a + b }
3.縮寫參數名稱
上一節介紹的閉包表達式已經很簡潔了,不過,Swift的閉包還可以再進行簡化。Swift提供了參數名稱縮寫功能,我們可以用$0、$1、$2來表示調用閉包中參數,$0指代第一個參數,$1指代第二個參數,$2指代第三個參數,以此類推$n+1指代第n個參數。
使用參數名稱縮寫,還可以在閉包中省略參數列表的定義,Swift能夠推斷出這些縮寫參數的類型。此外,in關鍵字也可以省略。參數名稱縮寫之後如下所示:
{$0 + $1}
使用參數名稱縮寫修改後的示例代碼如下:
func calculate(opr :String)-> (Int,Int)-> Int { var result : (Int,Int)-> Int switch (opr) { case "+" : result = {$0 + $1} ① default: result = {$0 - $1} ② } return result; } let f1:(Int,Int)-> Int = calculate("+") println("10 + 5 = \(f1(10,5))") let f2:(Int,Int)-> Int = calculate("-") println("10 + 5 = \(f2(10,5))")
上述代碼第①行和第②行的閉包采用了參數名稱縮寫。
4.使用閉包返回值
閉包表達本質上是函數類型,是有返回值的,我們可以直接在表達式中使用閉包的返回值。重新修改add和sub閉包,示例代碼如下:
let c1:Int = {(a:Int, b:Int) -> Int in return a + b }(10,5) ① println("10 + 5 = \(c1)") let c2:Int = {(a:Int, b:Int) -> Int in return a - b }(10,5) ② println("10 - 5 = \(c2)")
上述代碼有兩個表達式,第①行代碼是給c1賦值,後麵是一個閉包表達式。但是閉包表達式不能直接賦值給c1,因為c1是Int類型,需要閉包的返回值。這就需要在閉包結尾的大括號後麵接一對小括號(10,5),通過小括號(10,5)為閉包傳遞參數。第②行代碼也是如此。通過這種方法可以為變量和常量直接賦值,在有些場景下使用非常方便。
更多內容請關注國內第一本Swift圖書《Swift開發指南》
本書交流討論網站:https://www.51work6.com/swift.php
歡迎加入Swift技術討論群:362298485
歡迎關注智捷iOS課堂微信公共平台

最後更新:2017-04-03 05:40:13