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 }
使用這種簡化方式修改後的示例代碼以下:
php

[html] view plaincopyhtml

  1. func calculate(opr :String)-> (Int,Int)-> Int {  swift

  2.   

  3.   

  4.     var result : (Int,Int)-> Int  微信

  5.       

  6.     switch (opr) {  閉包

  7.     case "+" :  函數

  8.         result = {a, b in return a + b }        ①  網站

  9.     default:  spa

  10.         result = {a, b in return a - b }        ②  .net

  11.     }  orm

  12.     return result;  

  13. }  

  14.   

  15.   

  16. let f1:(Int,Int)-> Int = calculate("+")  

  17. println("10 + 5 = \(f1(10,5))")  

  18.   

  19.   

  20. let f2:(Int,Int)-> Int = calculate("-")  

  21. println("10 + 5 = \(f2(10,5))")  



上述代碼第①行和第②行的閉包是上一節示例的簡化寫法,其中a和b是參數,return後面是返回值。怎麼樣?很簡單吧?
2.隱藏return關鍵字
若是在閉包內部語句組只有一條語句,如return a + b等,那麼這種語句都是返回語句。前面的關鍵字return能夠省略,省略形式以下:
{a, b in a + b }
使用這種簡化方式修改後的示例代碼以下:

[html] view plaincopy

  1. func calculate(opr :String)-> (Int,Int)-> Int {  

  2.   

  3.   

  4.     var result : (Int,Int)-> Int  

  5.       

  6.     switch (opr) {  

  7.     case "+" :  

  8.         result = {a, b in return a + b }        ①  

  9.     default:  

  10.         result = {a, b in return a - b }        ②  

  11.     }  

  12.     return result;  

  13. }  




上述代碼第①行和第②行的閉包return關鍵字省略了,須要注意的是,省略的前提是閉包中只有一條return語句。下面這樣有多條語句是不容許的。
{a, b in var c; a + b }
3.縮寫參數名稱
上一節介紹的閉包表達式已經很簡潔了,不過,Swift的閉包還能夠再進行簡化。Swift提供了參數名稱縮寫功能,咱們能夠用$0、$一、$2來表示調用閉包中參數,$0指代第一個參數,$1指代第二個參數,$2指代第三個參數,以此類推$n+1指代第n個參數。
使用參數名稱縮寫,還能夠在閉包中省略參數列表的定義,Swift可以推斷出這些縮寫參數的類型。此外,in關鍵字也能夠省略。參數名稱縮寫以後以下所示:
{$0 + $1}
使用參數名稱縮寫修改後的示例代碼以下:

[html] view plaincopy

  1. func calculate(opr :String)-> (Int,Int)-> Int {  

  2.   

  3.   

  4.     var result : (Int,Int)-> Int  

  5.       

  6.     switch (opr) {  

  7.     case "+" :  

  8.         result = {$0 + $1}  ①  

  9.     default:  

  10.         result = {$0 - $1}  ②  

  11.     }  

  12.     return result;  

  13. }  

  14.   

  15.   

  16. let f1:(Int,Int)-> Int = calculate("+")  

  17. println("10 + 5 = \(f1(10,5))")  

  18.   

  19.   

  20. let f2:(Int,Int)-> Int = calculate("-")  

  21. println("10 + 5 = \(f2(10,5))")  



上述代碼第①行和第②行的閉包採用了參數名稱縮寫。
4.使用閉包返回值
閉包表達本質上是函數類型,是有返回值的,咱們能夠直接在表達式中使用閉包的返回值。從新修改add和sub閉包,示例代碼以下:

[html] view plaincopy

  1. let c1:Int = {(a:Int, b:Int) -> Int in  

  2.                 return a + b  

  3.           }(10,5)       ①  

  4.   

  5.   

  6. println("10 + 5 = \(c1)")  

  7.   

  8.   

  9. let c2:Int = {(a:Int, b:Int) -> Int in  

  10.                     return a - b  

  11.                 }(10,5)     ②  

  12.   

  13.   

  14. println("10 - 5 = \(c2)")  



上述代碼有兩個表達式,第①行代碼是給c1賦值,後面是一個閉包表達式。可是閉包表達式不能直接賦值給c1,由於c1是Int類型,須要閉包的返回值。這就須要在閉包結尾的大括號後面接一對小括號(10,5),經過小括號(10,5)爲閉包傳遞參數。第②行代碼也是如此。經過這種方法能夠爲變量和常量直接賦值,在有些場景下使用很是方便。


更多內容請關注國內第一本Swift圖書《Swift開發指南》

本書交流討論網站:http://www.51work6.com/swift.php

歡迎加入Swift技術討論羣:362298485

歡迎關注智捷iOS課堂微信公共平臺

相關文章
相關標籤/搜索