以擼代碼的形式學(xué)習(xí)Swift-7:閉包(Closure)

閉包是自包含的函數(shù)代碼塊漱挎,可以在代碼中被傳遞和使用。
Swift 中的閉包與 C 和 Objective-C 中的代碼塊(blocks)以及其他一些編程語言中的匿名函數(shù)比較相似雀哨。
閉包可以捕獲和存儲其所在上下文中任意常量和變量的引用磕谅。

1 閉包表達式(Closure Expressions)

// sorted 方法(The Sorted Method)
// 原數(shù)組不會被 sorted(by:) 方法修改私爷。
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella", "Andy", "Amni"]
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)

閉包表達式語法:

 { (parameters) -> returnType in
 statements
 }
 關(guān)鍵字`in`表示閉包的參數(shù)和返回值類型定義已經(jīng)完成,閉包函數(shù)體即將開始膊夹。
var reversedNames2 = names.sorted(by: {(s1:String, s2:String) -> Bool in return s1>s2})

根據(jù)上下文推斷類型(Inferring Type From Context)

    var reversedNames3 = names.sorted(by: {(s1, s2)->Bool in return s1>s2})

根據(jù)上下文推斷類型(Inferring Type From Context) 省略 return 和 返回值

    var reversedNames4 = names.sorted(by: {(s1, s2) in s1>s2})

參數(shù)名稱縮寫(Shorthand Argument Names):直接通過 0 衬浑,1 硅确, $2 來順序調(diào)用閉包的參數(shù)

    var reversedNames5 = names.sorted(by: {$0>$1})

運算符方法(Operator Methods)

    var reversedNames6 = names.sorted(by: >)

2 尾隨閉包(Trailing Closures):將一個很長的閉包表達式作為最后一個參數(shù)傳遞給函數(shù)

不使用尾隨閉包進行函數(shù)調(diào)用:

func someFunctionThatTakesAClosure(closure: {
// 閉包主體部分 
})

使用尾隨閉包進行函數(shù)調(diào)用:

func someFunctionThatTakesAClosure() {
// 閉包主體部分 
}
var reversedNames7 = names.sorted(){$0>$1}
var reversedNames8 = names.sorted{$0>$1}        // 當閉包表達式是唯一參數(shù)時役纹, ()可省略
let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]
let strings = numbers.map {
    (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number%10]! + output        // 字典下標返回一個可選值(optional value)
        number /= 10
    } while number > 0
    return output
}

3 值捕獲(Capturing Values)

閉包可以在其被定義的上下文中捕獲常量或變量。即使定義這些常量和變量的原作用域已經(jīng)不存在迈套,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值宏榕。

嵌套函數(shù) 是 捕獲值的閉包的最簡單形式

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}
var funcby10 = makeIncrementer(forIncrement: 10)
var funcby50 = makeIncrementer(forIncrement: 50)
// 新生成的incrementer函數(shù)拓诸,都會各自獲得類似全局變量的 amount和runingTotal
funcby50()
funcby50()
funcby10()

4 閉包是引用類型(Closures Are Reference Types)

// 函數(shù)和閉包都是引用類型
// 無論將函數(shù)或閉包賦值給一個常量還是變量,實際上都是將常量或變量的值設(shè)置為對應(yīng)函數(shù)或閉包的引用麻昼。

let funcbyTen = funcby10
funcbyTen()

逃逸閉包(Escaping Closures)

自動閉包(Autoclosures)

playground文件在andyRon/LearnSwift

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奠支,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抚芦,更是在濱河造成了極大的恐慌倍谜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叉抡,死亡現(xiàn)場離奇詭異尔崔,居然都是意外死亡,警方通過查閱死者的電腦和手機褥民,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門季春,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人消返,你說我怎么就攤上這事载弄。” “怎么了撵颊?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵宇攻,是天一觀的道長。 經(jīng)常有香客問我倡勇,道長逞刷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任妻熊,我火速辦了婚禮夸浅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘固耘。我一直安慰自己题篷,他們只是感情好词身,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布厅目。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪损敷。 梳的紋絲不亂的頭發(fā)上葫笼,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音拗馒,去河邊找鬼路星。 笑死,一個胖子當著我的面吹牛诱桂,可吹牛的內(nèi)容都是我干的洋丐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挥等,長吁一口氣:“原來是場噩夢啊……” “哼友绝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肝劲,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迁客,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辞槐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掷漱,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年榄檬,在試婚紗的時候發(fā)現(xiàn)自己被綠了卜范。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹿榜,死狀恐怖先朦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情犬缨,我是刑警寧澤喳魏,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站怀薛,受9級特大地震影響刺彩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枝恋,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一创倔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焚碌,春花似錦畦攘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叹螟。三九已至,卻和暖如春台盯,著一層夾襖步出監(jiān)牢的瞬間罢绽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工静盅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留良价,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓蒿叠,卻偏偏與公主長得像明垢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子市咽,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容