閉包

閉包

本節(jié)內容包括:

  • 閉包表達式
  • 尾隨閉包
  • 值捕獲
  • 閉包是引用類型

Swift 中的閉包與 C 和 Objective-C 中的代碼塊(blocks)以及其他一些編程語言中的 lambdas 函數比較相似揪利。

閉包表達式

嵌套函數 是一個在較復雜函數中方便進行命名和定義自包含代碼模塊的方式。當然翔始,有時候撰寫小巧的沒有完整定義和命名的類函數結構也是很有用處的,尤其是在您處理一些函數并需要將另外一些函數作為該函數的參數時案淋。

閉包表達式是一種利用簡潔語法構建內聯(lián)閉包的方式擎浴。 閉包表達式提供了一些語法優(yōu)化,使得撰寫閉包變得簡單明了丰介。 下面閉包表達式的例子通過使用幾次迭代展示了sorted函數定義和語法優(yōu)化的方式位谋。 每一次迭代都用更簡潔的方式描述了相同的功能山析。

sorted函數

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = sorted(names, backwards)
// reversed 為 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

閉包表達式語法

閉包表達式語法有如下一般形式

{ (parameters) -> returnType in
    statements
}

之前函數對應的例子為:

reversed = sorted(names, { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

根據上下文推斷類型

任何情況下,通過內聯(lián)閉包表達式構造的閉包作為參數傳遞給函數時掏父,都可以推斷出閉包的參數和返回值類型,這意味著您幾乎不需要利用完整格式構造任何內聯(lián)閉包秆剪。

reversed = sorted(name, {s1,s2 in return s1 > s2})

單表達式閉包隱式返回

單行表達式閉包可以通過隱藏return關鍵字來隱式返回單行表達式的結果

reversed = sorted(names, {s1, s2 in s1 > s2})

參數名稱縮寫

Swift 自動為內聯(lián)函數提供了參數名稱縮寫功能赊淑,您可以直接通過$0,$1,$2來順序調用閉包的參數。

如果您在閉包表達式中使用參數名稱縮寫仅讽,您可以在閉包參數列表中省略對其的定義陶缺,并且對應參數名稱縮寫的類型會通過函數類型進行推斷。 in關鍵字也同樣可以被省略洁灵,因為此時閉包表達式完全由閉包函數體構成:

reversed = sorted(names, {$0 > $1})

運算符函數

實際上還有一種更簡短的方式來撰寫上面例子中的閉包表達式饱岸。 Swift 的String類型定義了關于大于號 (>) 的字符串實現(xiàn),其作為一個函數接受兩個String類型的參數并返回Bool類型的值徽千。 而這正好與sorted函數的第二個參數需要的函數類型相符合苫费。 因此,您可以簡單地傳遞一個大于號双抽,Swift可以自動推斷出您想使用大于號的字符串函數實現(xiàn):

reversed = sorted(names , >)

尾隨閉包

如果您需要將一個很長的閉包表達式作為最后一個參數傳遞給函數百框,可以使用尾隨閉包來增強函數的可讀性。 尾隨閉包是一個書寫在函數括號之后的閉包表達式牍汹,函數支持將其作為最后一個參數調用铐维。

reversed = sorted(names) { $0 > $1 }

捕獲值

閉包可以在其定義的上下文中捕獲常量或變量柬泽。 即使定義這些常量和變量的原域已經不存在,閉包仍然可以在閉包函數體內引用和修改這些值嫁蛇。

Swift最簡單的閉包形式是嵌套函數锨并,也就是定義在其他函數的函數體內的函數。 嵌套函數可以捕獲其外部函數所有的參數以及定義的常量和變量睬棚。

閉包是引用類型

無論您將函數/閉包賦值給一個常量還是變量第煮,您實際上都是將常量/變量的值設置為對應函數/閉包的引用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闸拿,一起剝皮案震驚了整個濱河市空盼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌新荤,老刑警劉巖揽趾,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苛骨,居然都是意外死亡篱瞎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門痒芝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俐筋,“玉大人,你說我怎么就攤上這事严衬〕握撸” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵请琳,是天一觀的道長粱挡。 經常有香客問我,道長俄精,這世上最難降的妖魔是什么询筏? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮竖慧,結果婚禮上嫌套,老公的妹妹穿的比我還像新娘。我一直安慰自己圾旨,他們只是感情好踱讨,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碳胳,像睡著了一般勇蝙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天味混,我揣著相機與錄音产雹,去河邊找鬼。 笑死翁锡,一個胖子當著我的面吹牛蔓挖,可吹牛的內容都是我干的。 我是一名探鬼主播馆衔,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瘟判,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了角溃?” 一聲冷哼從身側響起拷获,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎减细,沒想到半個月后匆瓜,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡未蝌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年驮吱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萧吠。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡左冬,死狀恐怖,靈堂內的尸體忽然破棺而出纸型,到底是詐尸還是另有隱情拇砰,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布狰腌,位于F島的核電站毕匀,受9級特大地震影響,放射性物質發(fā)生泄漏癌别。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一蹋笼、第九天 我趴在偏房一處隱蔽的房頂上張望展姐。 院中可真熱鬧,春花似錦剖毯、人聲如沸圾笨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擂达。三九已至,卻和暖如春胶滋,著一層夾襖步出監(jiān)牢的瞬間板鬓,已是汗流浹背悲敷。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俭令,地道東北人后德。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像抄腔,于是被迫代替她去往敵國和親瓢湃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容