Swift閉包函數(shù)(Array)

閉包概述:(以下是我拷貝的)

閉包(Closures)

  • 閉包是自包含的功能代碼塊拳芙,可以在代碼中使用或者用來作為參數(shù)傳值籽孙。
  • 在Swift中的閉包與C亲善、OC中的blocks和其它編程語言(如Python)中的lambdas類似凉袱。
  • 閉包可以捕獲和存儲(chǔ)上下文中定義的的任何常量和變量的引用傲宜。這就是所謂的變量和變量的自封閉运杭,
  • 因此命名為”閉包“("Closures)").Swift還會(huì)處理所有捕獲的引用的內(nèi)存管理。
  • 全局函數(shù)和嵌套函數(shù)其實(shí)就是特殊的閉包函卒。
  • 閉包的形式有:
  • (1)全局函數(shù)都是閉包辆憔,有名字但不能捕獲任何值。
  • (2)嵌套函數(shù)都是閉包报嵌,且有名字虱咧,也能捕獲封閉函數(shù)內(nèi)的值。
  • (3)閉包表達(dá)式都是無名閉包锚国,使用輕量級語法腕巡,可以根據(jù)上下文環(huán)境捕獲值。
  • Swift中的閉包有很多優(yōu)化的地方:
  • (1)根據(jù)上下文推斷參數(shù)和返回值類型
  • (2)從單行表達(dá)式閉包中隱式返回(也就是閉包體只有一行代碼血筑,可以省略return)
  • (3)可以使用簡化參數(shù)名绘沉,如$0, $1(從0開始,表示第i個(gè)參數(shù)...)
  • (4)提供了尾隨閉包語法(Trailing closure syntax)

問題:對names中的元素按字母升序排序 (Z最小,A最大)

var names = ["Swift", "Arial", "Soga", "Donary"]

函數(shù)寫法

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2 // 升序排序
}

var reversed = names.sort(backwards)

把上面的普通函數(shù)寫法轉(zhuǎn)換為閉包函數(shù)

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

sort是一個(gè)排序函數(shù)豺总,它通過基于輸出類型排序的閉包函數(shù)车伞,給已知類型的數(shù)組數(shù)據(jù)的值排序。需要一個(gè)閉包參數(shù)作為參數(shù):Sort函數(shù)的完整抽象形態(tài)如下:

    names.sort { (String1, String2) -> Bool in
        do someting
        return Bool
    }

sort也是一個(gè)尾隨閉包函數(shù)(Trailing Closures)
如果函數(shù)需要一個(gè)閉包參數(shù)作為參數(shù)喻喳,且這個(gè)參數(shù)是最后一個(gè)參數(shù)另玖,而這個(gè)閉包表達(dá)式又很長時(shí),可以使用尾隨閉包。尾隨閉包可以放在函數(shù)參數(shù)列表外日矫,也就是括號(hào)外赂弓。
如果尾隨閉包函數(shù)只有一個(gè)參數(shù),那么可以把括號(hào)()省略掉哪轿,后面直接跟著閉包盈魁。

尾隨閉包去掉括號(hào)

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

由于參數(shù)傳入時(shí)swift會(huì)進(jìn)行隱式類型推導(dǎo),省去參數(shù)類型

reversed = names.sort{
    (s1,s2) -> Bool in
    return s1 > s2
}

同理由于結(jié)果return時(shí)swift會(huì)進(jìn)行隱式類型推導(dǎo)窃诉,省去返回值類型

reversed = names.sort{
    (s1,s2) in
    return s1 > s2
}

既然類型都沒了杨耙,閉包里面自帶了一套默認(rèn)的參數(shù)名,你可以不聲明閉包參數(shù)列表飘痛。
第一參數(shù):$0,第二參數(shù):$1 ...
這是后閉包函數(shù)聲明中的參數(shù)列表和返回值類型都沒了
那么關(guān)鍵字in也省了吧珊膜,直接寫內(nèi)部結(jié)構(gòu)體

reversed = names.sort{
    return $0 > $1
}

如果內(nèi)部結(jié)構(gòu)體中只有return這么一句話,return也能省

reversed = names.sort{$0 > $1}

最簡單的寫法宣脉,只留下操作符车柠,注意,這時(shí)候尾閉包使用的是()
這種方法只適用于閉包中只有"默認(rèn)參數(shù)名"和"運(yùn)算符"這兩者的情況

reversed = names.sort(>)

閉包的運(yùn)用:捕獲值(內(nèi)嵌函數(shù)捕獲外部函數(shù)中定義的常量和變量)

func increment(amount amount: Int) -> (() -> Int) {
    var total = 0
    func incrementAmount() -> Int {
        total += amount // total是外部函數(shù)體內(nèi)的變量塑猖,這里是可以捕獲到的
        return total
    }
    return incrementAmount // 返回的是一個(gè)嵌套函數(shù)(閉包)
}

// 閉包是引用類型竹祷,所以incrementByTen聲明為常量也可以修改total
let incrementByTen = increment(amount: 10)
incrementByTen() // return 10,incrementByTen是一個(gè)閉包
incrementByTen() // return 20
incrementByTen() // return 30

let incrementByOne = increment(amount: 1)
incrementByOne() // return 1
incrementByOne() // return 2
incrementByOne() // return 3

//函數(shù)本身不占內(nèi)存,使用賦值后才占.
//所以多次調(diào)用同一個(gè)函數(shù)不會(huì)對其他調(diào)用該函數(shù)的變量造成影響
//incrementByTen和incrementByOne不會(huì)應(yīng)為他們都使用increment而相互影響
incrementByTen() // return 40
incrementByOne() // return 4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羊苟,一起剝皮案震驚了整個(gè)濱河市塑陵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜡励,老刑警劉巖令花,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凉倚,居然都是意外死亡兼都,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門稽寒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俯抖,“玉大人,你說我怎么就攤上這事瓦胎。” “怎么了尤揣?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵搔啊,是天一觀的道長。 經(jīng)常有香客問我北戏,道長负芋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮旧蛾,結(jié)果婚禮上莽龟,老公的妹妹穿的比我還像新娘。我一直安慰自己锨天,他們只是感情好毯盈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著病袄,像睡著了一般搂赋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上益缠,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天脑奠,我揣著相機(jī)與錄音,去河邊找鬼幅慌。 笑死宋欺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胰伍。 我是一名探鬼主播齿诞,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喇辽!你這毒婦竟也來了掌挚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤菩咨,失蹤者是張志新(化名)和其女友劉穎吠式,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抽米,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡特占,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了云茸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片是目。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖标捺,靈堂內(nèi)的尸體忽然破棺而出懊纳,到底是詐尸還是另有隱情,我是刑警寧澤亡容,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布嗤疯,位于F島的核電站,受9級特大地震影響闺兢,放射性物質(zhì)發(fā)生泄漏茂缚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脚囊。 院中可真熱鬧龟糕,春花似錦、人聲如沸悔耘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淮逊。三九已至催首,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泄鹏,已是汗流浹背郎任。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留备籽,地道東北人舶治。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像车猬,于是被迫代替她去往敵國和親霉猛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • 閉包是自包含的函數(shù)代碼塊珠闰,可以在代碼中被傳遞和使用惜浅。Swift 中的閉包與 C 和 Objective-C 中的代...
    窮人家的孩紙閱讀 1,713評論 1 5
  • 閉包可以從定義它們的上下文中捕獲和存儲(chǔ)對任何常量和變量的引用。 這被稱為關(guān)閉這些常量和變量伏嗜。 Swift處理所有的...
    Joker_King閱讀 594評論 0 2
  • 閉包是功能性自包含模塊坛悉,可以在代碼中被傳遞和使用。Swift中的閉包與 C 和 Objective-C中的 blo...
    AirZilong閱讀 349評論 0 2
  • 本章將會(huì)介紹 閉包表達(dá)式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動(dòng)閉包枚舉語法使用Switch語句匹配枚舉值關(guān)聯(lián)值原...
    寒橋閱讀 1,562評論 0 3
  • 每個(gè)人心里都有一個(gè)遠(yuǎn)方轩猩,很早以前我們稱之為夢想。而在夢想越來越大眾化的今天荡澎,我們更愿意談?wù)勥h(yuǎn)方均践。關(guān)于青春,關(guān)于自由...
    李木子的七年閱讀 165評論 0 0