《從零開始學Swift》學習筆記(Day 22)——閉包那些事兒!

原創文章,歡迎轉載。轉載請注明:關東升的博客

我給Swift 中的閉包一個定義:閉包是自包含的匿名函數代碼塊,可以作為表達式、函數參數和函數返回值,閉包表達式的運算結果是一種函數類型。
Swift中的閉包類似于Objective-C 中的代碼塊、Java中的匿名內部類。
使用閉包表達式
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 }   
{a, b in return a + b } //參數列表括號也可以省略

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 a + b } //return關鍵字省略了
    default:
    result = {a, b in a - b } //return關鍵字省略了
    }
    return result
}

省略的前提是閉包中只有一條return語句。

3、省略參數名稱
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("+")
print("10 + 5 = \(f1(10,5))")

let f2:(Int,Int)-> Int = calculate("-")
print("10 - 5 = \(f2(10,5))")

4、使用閉包返回值
閉包表達本質上是函數類型,是有返回值的,我們可以直接在表達式中使用閉包的返回值。重新修改add和sub閉包,示例代碼如下:

let c1:Int = {(a:Int, b:Int) -> Int in
            return a + b
                }(10,5)   

print("10 + 5 = \(c1)")

解釋:給c1賦值,后面是一個閉包表達式。但是閉包表達式不能直接賦值給c1,因為c1是Int類型,需要閉包的返回值。這就需要在閉包結尾的大括號后面接一對小括號(10,5),通過小括號(10,5)為閉包傳遞參數。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容