Swift-閉包

Swift 閉包

函數(shù) ()->()

Swift 中的閉包和 Objective-C 中的 block 類(lèi)似,閉包是功能性自包含模塊淮悼,可以在代碼中被傳遞和使用。 在 Swift 中 函數(shù)只是閉包的一種特殊形式洲愤。

1.全局函數(shù)是一個(gè)有名字但不會(huì)捕獲任何值的閉包
2.內(nèi)嵌函數(shù)是一個(gè)有名字可以捕獲到所在的函數(shù)域內(nèi)值的閉包
3.閉包表達(dá)式是一個(gè)沒(méi)有名字的可以捕獲上下文中的變量或者常量的閉包

定義函數(shù)

我們?cè)?Swift 中使用 func 關(guān)鍵字來(lái)定義函數(shù)颅痊,函數(shù)可以沒(méi)有參數(shù)和返回值,也可以有一個(gè)或者多個(gè)參數(shù)和返回值彻犁。在Swift中多個(gè)參數(shù)的返回值叫做元組(tuples)

 func foo(firstname:String ,lastname:String)->(fullname:String){
      return("\(firstname) \(lastname)")
 }

函數(shù)調(diào)用

 let fullname = foo("zhao”,”sunny”)

函數(shù)類(lèi)型

每一個(gè)函數(shù)都有它的類(lèi)型叫胁,函數(shù)的類(lèi)型由函數(shù)本身的參數(shù)類(lèi)型和返回值類(lèi)型來(lái)決定的。

  func sum(x:Int,y:Int) -> (result:Int){return x + Y}

上面這個(gè)函數(shù)的函數(shù)類(lèi)型就是

  (Int,Int)->(Int)

函數(shù)類(lèi)型在構(gòu)建函數(shù)的時(shí)候當(dāng)成參數(shù)類(lèi)型或者返回值類(lèi)型來(lái)使用汞幢。

返回函數(shù)類(lèi)型

func foo()->((String,String) -> String){
   func bar(firstname:String,lastname:String) ->(fullname:String){
    return("\(firstname) \(lastname)")
  }
  return bar
}
let namecombination = foo()
namecombination("wang","er")

可變參數(shù)函數(shù)

可變參數(shù)函數(shù)是指函數(shù)可以接收不固定個(gè)參數(shù)驼鹅。在參數(shù)類(lèi)型后面添加 來(lái)標(biāo)記這個(gè)參數(shù)為可變參數(shù)。我們可以在函數(shù)中像訪問(wèn)數(shù)組一樣訪問(wèn)可變參數(shù)。

func foo(names:String...) ->() {
  for name in names {
   println("\(name)")
  }
}
func foo("zhao","zhang","wang")

In-out 參數(shù)函數(shù)

傳入函數(shù)的參數(shù)值只能在函數(shù)域內(nèi)改變输钩。參數(shù)傳遞是值傳遞豺型,也就是說(shuō)我們?cè)诤瘮?shù)內(nèi)部修改了一個(gè)參數(shù)的值,在函數(shù)結(jié)束后买乃,函數(shù)外部訪問(wèn)到的參數(shù)值還是傳入函數(shù)之前的值触创,它并沒(méi)有隨著函數(shù)內(nèi)的修改而改變。在Objective-C 我們通過(guò)指針來(lái)保存函數(shù)內(nèi)修改過(guò)的值以供函數(shù)結(jié)束后外部訪問(wèn)为牍。常見(jiàn)的例子就是 NSError 的使用哼绑。
Swift 中我們也可以做類(lèi)似的操作。我們需要inout 關(guān)鍵字來(lái)標(biāo)記要修改的參數(shù)碉咆。

func swapTwoInts(inout a: Int, inout b: Int) { 
    let temporaryA = a
     a = b 
        b = temporaryA
 }
 var someInt = 3 
 var anotherInt = 107 
 swapTwoInts(&someInt, &anotherInt)  

閉包 { ()->() in }

定義一個(gè)閉包

閉包是一個(gè)使用花括號(hào){} 包圍起來(lái)抖韩,并且使用函數(shù)類(lèi)型()->()來(lái)定義的代碼模塊。->符號(hào)分割了輸入?yún)?shù)和返回值類(lèi)型疫铜。在關(guān)鍵字 in 來(lái)區(qū)分閉包的頭和閉包函數(shù)體茂浮。

 {(params) -> returnType in 
    statements
 }

一個(gè)數(shù)組的map閉包的例子

let names = ["zhao","wang","Li"]
names.map({
  (name:String) -> String in 
   "\(name) has been map !"
})

已知參數(shù)類(lèi)型的閉包

map的閉包是作為函數(shù)參數(shù)傳入的,所以 Swift 是可以做類(lèi)型推斷的壳咕,這樣的話(huà)我們就不需要在閉包中在描述閉包的函數(shù)類(lèi)型席揽,也就是我們可以省略 (String) -> (String) 部分,來(lái)簡(jiǎn)寫(xiě)閉包表達(dá)式

let names = ["zhao","wang","Li"]
names.map({
  name in 
    "\(name) has been map !"
}) 

如果閉包有返回值我們也可以簡(jiǎn)寫(xiě)省略掉return谓厘。

例如

let names = ["zhao","wang","Li"]
let orderNames = sort(names,{s1,s2 in s1 > s2})

閉包參數(shù)名簡(jiǎn)寫(xiě)

Swift 為內(nèi)聯(lián)函數(shù)提供了參數(shù)名稱(chēng)簡(jiǎn)寫(xiě)功能幌羞,您可以直接通過(guò) $0,$1,$2等名字來(lái)引用的閉包的參數(shù)的值。

let names = ["zhao","wang","Li"]
names.map({"\($0) has been map !"})
sort(names,{$0 > $1})

如果閉包是函數(shù)的最后一個(gè)參數(shù)竟稳,我們可以省略掉圓括號(hào)

names.map{"\($0) has been map !"}
sort(names){$0 > $1}

對(duì)于排序函數(shù) sort() 來(lái)說(shuō)作為參數(shù)的閉包表達(dá)式只進(jìn)行了兩個(gè)值的比較属桦,比較是通過(guò)操作符 >來(lái)進(jìn)行的。在Swift中可以進(jìn)行操作符重載他爸,我們會(huì)發(fā)現(xiàn)在String 中定義了>的函數(shù)實(shí)現(xiàn)聂宾,也就是 > 本身就是一個(gè)函數(shù) ,它接收兩個(gè)String 類(lèi)型的參數(shù) 并返回一個(gè)Bool類(lèi)型的值诊笤。這和 Sort 函數(shù)的第二個(gè)參數(shù)的類(lèi)型是一致的系谐。所以,我們還可以進(jìn)一步簡(jiǎn)寫(xiě) Sort()

sort(names,>)

閉包跟函數(shù)是引用類(lèi)型

無(wú)論您將函數(shù)/閉包賦值給一個(gè)常量還是變量讨跟,您實(shí)際上都是將常量/變量的值設(shè)置為對(duì)應(yīng)函數(shù)/閉包的引用纪他。這也意味著如果您將閉包賦值給了兩個(gè)不同的常量/變量,兩個(gè)值都會(huì)指向同一個(gè)閉包.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末许赃,一起剝皮案震驚了整個(gè)濱河市止喷,隨后出現(xiàn)的幾起案子馆类,更是在濱河造成了極大的恐慌混聊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異句喜,居然都是意外死亡预愤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)咳胃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)植康,“玉大人,你說(shuō)我怎么就攤上這事展懈∠觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵存崖,是天一觀的道長(zhǎng)冻记。 經(jīng)常有香客問(wèn)我,道長(zhǎng)来惧,這世上最難降的妖魔是什么冗栗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮供搀,結(jié)果婚禮上隅居,老公的妹妹穿的比我還像新娘。我一直安慰自己葛虐,他們只是感情好胎源,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著屿脐,像睡著了一般乒融。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摄悯,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天赞季,我揣著相機(jī)與錄音,去河邊找鬼奢驯。 笑死申钩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘪阁。 我是一名探鬼主播撒遣,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼管跺!你這毒婦竟也來(lái)了义黎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豁跑,失蹤者是張志新(化名)和其女友劉穎廉涕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狐蜕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年宠纯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片层释。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婆瓜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贡羔,到底是詐尸還是另有隱情廉白,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布乖寒,位于F島的核電站蒙秒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宵统。R本人自食惡果不足惜晕讲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望马澈。 院中可真熱鬧瓢省,春花似錦、人聲如沸痊班。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涤伐。三九已至馒胆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凝果,已是汗流浹背祝迂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留器净,地道東北人型雳。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像山害,于是被迫代替她去往敵國(guó)和親纠俭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 閉包是功能性自包含模塊浪慌,可以在代碼中被傳遞和使用冤荆。Swift中的閉包與 C 和 Objective-C中的 blo...
    AirZilong閱讀 347評(píng)論 0 2
  • 閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用权纤。Swift 中的閉包與 C 和 Objective-C 中的代...
    窮人家的孩紙閱讀 1,697評(píng)論 1 5
  • 閉包可以從定義它們的上下文中捕獲和存儲(chǔ)對(duì)任何常量和變量的引用钓简。 這被稱(chēng)為關(guān)閉這些常量和變量乌妒。 Swift處理所有的...
    Joker_King閱讀 586評(píng)論 0 2
  • * 閉包 是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用涌庭。swift中的閉包和Objective-C中的代碼塊(b...
    EndEvent閱讀 854評(píng)論 4 8
  • 閉包是自包含的代碼塊芥被,可以在代碼中被傳遞和使用欧宜。Swift中的閉包與C和Objective-C中代碼塊(block...
    Raaaaamsey閱讀 837評(píng)論 0 2