Swift編程基礎(五):閉包

閉包是自包含的函數代碼塊,可以在代碼中使用或者用來作爲參數傳值。Swift中的閉包和OC中的blocks比較相似。

閉包可以捕獲和存儲所在上下文中任意常量和變量的引用。這就是閉合幷包裹着這些常量和變量,俗稱閉包。

閉包有三種形式:
1)全局函數是一個有名字但不會捕獲任何值的閉包;
2)嵌套函數是一個有名字並可以捕獲其封閉函數域內值的閉包;
3)閉包表達式是一個可以捕獲其上下文中變量或常量值的匿名閉包。

全局函數和嵌套函數都是特殊的閉包!!!

在此,我們重點講的是:閉包表達式
閉包表達式的表現形式非常靈活,下面會逐條列舉:
a、根據上下文推斷參數和返回值類型;
b、單表達式閉包隱式返回,即:如果閉包體只有一行代碼,可以省略return
c、可以使用簡化參數名,如:��0,��1(從0開始,表示第i個參數)
d、提供尾隨閉包語法

全局函數是一種特殊的閉包

var names = ["Chris", "Alex", "Ewa", "Barry","Daniella"]
func backwards(s1: String, s2: String) -> Bool {
     return s1 > s2
}
let reversed = names.sort(backwards)
print(reversed)
//打印結果:["Ewa", "Daniella", "Chris", "Barry", "Alex"]

函數backwards作爲sort()的參數傳遞進去,滿足閉包的定義——
閉包是自包含的函數代碼塊,可以在代碼中使用或者用來作爲參數傳值
我們可以清晰得看出來全局函數是一種特殊的閉包。

閉包表達式的一般形式

{(parameters) -> returnType in
statements
}

var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({(s1:String,s2:String) -> Bool in return s1>s2})
//myNames最後爲:["Ewa", "Daniella", "Chris", "Barry", "Alex"]

閉包表達式,簡寫方式一:根據上下文推斷參數和返回值類型

var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({s1,s2 in return s1>s2})
//myNames最後爲:["Ewa", "Daniella", "Chris", "Barry", "Alex"]。
//此閉包表達式省略了參數類型和返回值類型!

閉包表達式,簡寫方式二:單表達式閉包隱式返回

var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({s1,s2 in s1>s2})
//myNames最後爲:["Ewa", "Daniella", "Chris", "Barry", "Alex"]。
//此閉包表達式只有一行代碼,省略了return關鍵字!

閉包表達式,簡寫方式三:參數名稱縮寫

Swift自動爲內聯函數提供了參數名稱縮寫功能,您可以直接通過
0, 1,$2…來順序調用閉包的參數。

如果您在閉包表達式中使參數名稱縮寫,您可以在閉包參數列表中省略對其的定義,並且對應參數名稱縮寫的類型會通過函數類型進推斷。 in關鍵字也同樣可以被省略。

var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({$0>$1})
//myNames最後爲:["Ewa", "Daniella", "Chris", "Barry", "Alex"]。
//此閉包表達式只有一樣代碼,省略了return關鍵字!

閉包表達式,簡寫方式四:尾隨閉包

如果一個閉包表達式作爲最後一個參數傳遞給函數,可以使用尾隨閉包來增強函數的可讀性。尾隨閉包是一個書寫在函數括號之後的閉包表達式,函數支持將其作爲最後一個參數調用。

var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({s1,s2 in s1>s2})

對於上面這行代碼,尾隨閉包的寫法如下:
let myNames = names.sort(){s1,s2 in s1>s2}

還有哦,如果函數參數只有一個,那麼函數後面的括號都可以省略。
let myNames = names.sort{s1,s2 in s1>s2}
//好吧,括號省略掉了!閉包的表達方式還真是靈活!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章