閱讀354 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 兩個activity或者activity和fragment傳值
  下一篇:go Intel MIC架構下COI框架介紹