原創文章,歡迎轉載。轉載請註明:關東昇的博客 php
我給Swift 中的閉包一個定義:閉包是自包含的匿名函數代碼塊,能夠做爲表達式、函數參數和函數返回值,閉包表達式的運算結果是一種函數類型。java
Swift中的閉包相似於Objective-C 中的代碼塊、Java中的匿名內部類。微信
使用閉包表達式閉包
Swift中的閉包表達式很靈活,其標準語法格式以下:函數
{ (參數列表) ->返回值類型 in網站
語句組spa
}.net
其中,參數列表與函數中的參數列表形式同樣,返回值類型相似於函數中的返回值類型,但不一樣的是後面有in關鍵字。設計
Swift提供了多種閉包簡化寫法,我來介紹下面幾種不一樣形式:code
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)爲閉包傳遞參數。
歡迎關注關東昇新浪微博@tony_ 關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php