Swift中的函數(shù)及函數(shù)閉包使用

一星岗、引言

? ? ? ? 函數(shù)是有特定功能的代碼段牍白,函數(shù)會有一個特定的名稱調(diào)用時來使用。Swift提供了十分靈活的方式來創(chuàng)建與調(diào)用函數(shù)锻梳。事實上在Swift箭券,每個函數(shù)都是一種類型,這種類型由參數(shù)和返回值來決定疑枯。Swift和Objective-C的一大區(qū)別就在于Swift中的函數(shù)可以進(jìn)行嵌套邦鲫。

? ? ? ? 而Swift中的閉包是有一定功能的代碼塊,這十分類似于Objective-C中的block語法神汹。Swift中的閉包語法風(fēng)格十分簡潔庆捺,其作用和函數(shù)的作用相似。

二屁魏、函數(shù)的創(chuàng)建和調(diào)用

? ? ? ? 函數(shù)通過函數(shù)名滔以,參數(shù)和返回值來定義,參數(shù)和返回值決定一個函數(shù)的類型氓拼,在調(diào)用函數(shù)時你画,使用函數(shù)名來進(jìn)行調(diào)用,示例如下:

圖例1

? ? ? ?也可以創(chuàng)建沒有參數(shù)的函數(shù):

圖例2

? ? ? ? ?上面介紹的函數(shù)類型都比較常見桃漾,對于多返回值的函數(shù)坏匪,在Objective-C中十分難處理,開發(fā)者通常會采用字典撬统、數(shù)組等集合方式或者干脆使用block回調(diào)适滓,在Swift中,可以使用元組作為函數(shù)的返回值恋追,示例如下:

圖例3

? ? ? ? ? 也可以是函數(shù)返回一個Optional類型的值凭迹,支持返回nil,示例如下:

圖例4

? ? ? ? ?在函數(shù)的參數(shù)名前苦囱,開發(fā)者還可以再為其添加一個參數(shù)名稱作為外部參數(shù)名嗅绸,示例如下:

圖例5

? ? ? ? 其實Swift函數(shù)中的參數(shù)列表有這樣一個特點,除了第一個參數(shù)外撕彤,之后的參數(shù)都默認(rèn)添加一個一個和內(nèi)部名稱相同的外部名稱鱼鸠,如果開發(fā)者不想使用這個外部名稱,使用_符號設(shè)置,示例如下:(新版本的swift已做更改跟OC同步蚀狰,不過“_”依舊有效可用)

圖例6

? ? ? ? ? Swift也支持開發(fā)者為函數(shù)的參數(shù)創(chuàng)建一個默認(rèn)值漆弄,如果函數(shù)的某個參數(shù)有設(shè)置默認(rèn)值,則開發(fā)者在調(diào)用時可以省略此參數(shù)造锅,示例如下:

圖例7

? ? ? ? ?還有一種情形在Objective-C中也很難處理撼唾,對于參數(shù)數(shù)量不定的函數(shù),在前面章節(jié)介紹過哥蔚,Objective-C一般會使用list指針來完成倒谷,在Swift中編寫這樣的函數(shù)十分簡單,示例如下:

圖例8

? ? ? ? Swift中參數(shù)默認(rèn)是常量糙箍,在函數(shù)中是不能修改外部傳入?yún)?shù)的值的渤愁,如果有需求,需要將參數(shù)聲明成inout類型深夯,示例如下:(新版本下inout類型聲明到參數(shù)后抖格,參數(shù)類型Int前)

圖例9

三、函數(shù)類型

? ? ? ?函數(shù)是一種特殊的數(shù)據(jù)類型咕晋,每一個函數(shù)屬于一種數(shù)據(jù)類型雹拄,示例如下:

圖例10

? ? ? ? 函數(shù)也可以作為參數(shù)傳入另一個函數(shù),這十分類似于Objective-C中的block語法掌呜,示例如下:

圖例11

? ? ? Swift一個函數(shù)也可以作為另一個函數(shù)的返回值滓玖,同時支持函數(shù)的嵌套示例如下:

圖例12

四、從一個系統(tǒng)函數(shù)看閉包

? ? ? ? Swift標(biāo)準(zhǔn)函數(shù)庫中提供了一個sort排序函數(shù)质蕉,對于已經(jīng)元素類型的數(shù)組势篡,調(diào)用sort函數(shù)會進(jìn)行重新排序并返回新的排序后的數(shù)組。這個sort函數(shù)可以接收一個返回值為Bool類型的閉包模暗,來確定第一個元素是否排在第二個元素前面禁悠。代碼示例如下:

圖例13

? ? ? ? Swift語言有一個很顯著的特點就是簡潔,可以通過上下文推斷出類型的情況一般開發(fā)都可以將類型的書寫省略兑宇,這也是Swift語言設(shè)計的一個思路碍侦,由于閉包是作為函數(shù)的參數(shù)傳入函數(shù)中的,因為函數(shù)參數(shù)的類型是確定顾孽,因此閉包的類型是可以被編譯器推斷出來的祝钢,開發(fā)者也可以將閉包的參數(shù)類型和返回值省略,上面的代碼可以簡寫如下:

圖例14

? ? ? ? 實際上若厚,如果閉包中的函數(shù)體只有一行代碼,可以將return關(guān)鍵字也省略蜒什,這時會隱式的返回此行代碼的值测秸,如下:

圖例15

? ? ? ? 看到上面的表達(dá)式,是不是有點小震驚,閉包表達(dá)式竟然可以簡寫成這樣霎冯!然而铃拇,你還是小看的Swift開發(fā)團隊,后面的語法規(guī)則會讓你明白什么是簡潔的極致沈撞】独螅可以看到上面的代碼實現(xiàn)還是有3部分:參數(shù)和返回值,閉包關(guān)鍵字缠俺,函數(shù)體显晶。參數(shù)和返回值即是參數(shù)列表,p1壹士,p2磷雇,雖然省略了參數(shù)類型和返回值類型,但這部分的模塊還在躏救,閉包關(guān)鍵字即是in唯笙,它用來表示下面將是閉包的函數(shù)體,p1>p2即是函數(shù)體盒使,只是這里省略了return關(guān)鍵字崩掘。閉包中既然參數(shù)類型和返回值類型編譯器都可以自己推斷出來,那么參數(shù)的數(shù)量編輯器也是可以自行推斷的少办,因此呢堰,參數(shù)列表實際上也是多余的,閉包中會自動生成一些參數(shù)名稱凡泣,和實際的參數(shù)數(shù)量向?qū)?yīng)枉疼,例如上面sort函數(shù)中的閉包有兩個參數(shù),系統(tǒng)會自動生成$0和$1這兩個參數(shù)名鞋拟,開發(fā)者可以直接使用骂维,因為參數(shù)列表都會省略了,那么也不再需要閉包關(guān)鍵字in來分隔參數(shù)列表與函數(shù)體贺纲,這時航闺,閉包的寫法實際上變成了如下的模樣:

圖例16

? ? ? 你沒有看錯,加上左右的大括號猴誊,一共7個字符潦刃,完成了一個排序算法。除了Swift懈叹,我不知道是否還有第二種語言可以做到乖杠。拋開閉包不說,Swift中還有一種語法澄成,其可以定義類型的運算符方法胧洒,例如String類型可以通過=畏吓,<,>來進(jìn)行比較卫漫,實際上是String類中實現(xiàn)了這些運算符方法菲饼,在某種意義上說,一個運算符即類似與一個函數(shù)列赎,那么好了宏悦,sort函數(shù)中需要傳入的方法對于某些類型來說實際上只是需要一個運算符,示例如下:

圖例17

這次你可以真的震驚了包吝,完成排序新算法只需要一個字符饼煞,不折不扣的一個字符。

五漏策、Swift中閉包的更多特點

? ? ? ? ?Swift中的閉包還有一個有趣的特點派哲,首先閉包是作為參數(shù)傳入另一個函數(shù)中的,因此常規(guī)的寫法是將閉包的大括號寫在函數(shù)的參數(shù)列表小括號中掺喻,如果閉包中的代碼很多芭届,這時在代碼結(jié)構(gòu)上來看會變得并不太清晰,為了解決這個問題感耙,Swift中這樣規(guī)定:如果這個閉包參數(shù)是函數(shù)的最后一個參數(shù)褂乍,開發(fā)者可以將其拉出小括號,在函數(shù)尾部實現(xiàn)閉包代碼即硼,示例如下:

圖例18

? ? ? ?如果一個函數(shù)中只有一個參數(shù)逃片,且這個參數(shù)是一個閉包,那么開發(fā)者使用閉包結(jié)尾這種寫法只酥,完全可以將函數(shù)的參數(shù)列表小括號也省略掉褥实,示例如下:

圖例19

? ? ? ? Swift中還有一個閉包逃逸的概念,這個很好理解裂允,當(dāng)閉包作為參數(shù)傳遞進(jìn)函數(shù)時损离,如果這個閉包只在函數(shù)中被使用,則開發(fā)者可以將這個閉包聲明成非逃逸的绝编,即告訴系統(tǒng)當(dāng)此函數(shù)結(jié)束后僻澎,這個閉包的聲明周期也將結(jié)束,這樣做的好處是可以提高代碼性能十饥,將閉包聲明稱非逃逸的類型使用@noescape關(guān)鍵字窟勃,示例如下:

圖例20

逃逸的閉包常用于異步的操作,例如這個閉包是異步處理一個網(wǎng)絡(luò)請求逗堵,只有當(dāng)請求結(jié)束后秉氧,閉包的聲明周期才結(jié)束。非逃逸的閉包還有一個有趣的特點砸捏,在其內(nèi)部如果需要使用self這個關(guān)鍵字谬运,self可以被省略隙赁。

閉包也可以被自動的生成垦藏,這種閉包被稱為自動閉包梆暖,自動閉包可以自動將表達(dá)式封裝成閉包,開發(fā)者不需要再寫閉包的大括號格式掂骏,自動閉包不接收參數(shù)轰驳,返回值為其中表達(dá)式的值。示例如下:

圖例21

自動閉包默認(rèn)是非逃逸的弟灼,如果要使用逃逸的閉包级解,需要手動聲明,如下:

圖例22
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末田绑,一起剝皮案震驚了整個濱河市勤哗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掩驱,老刑警劉巖芒划,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欧穴,居然都是意外死亡民逼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門涮帘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拼苍,“玉大人,你說我怎么就攤上這事调缨〈辏” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵弦叶,是天一觀的道長俊犯。 經(jīng)常有香客問我,道長湾蔓,這世上最難降的妖魔是什么瘫析? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮默责,結(jié)果婚禮上贬循,老公的妹妹穿的比我還像新娘。我一直安慰自己桃序,他們只是感情好杖虾,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著媒熊,像睡著了一般奇适。 火紅的嫁衣襯著肌膚如雪坟比。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天嚷往,我揣著相機與錄音葛账,去河邊找鬼。 笑死皮仁,一個胖子當(dāng)著我的面吹牛籍琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贷祈,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼趋急,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了势誊?” 一聲冷哼從身側(cè)響起呜达,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粟耻,沒想到半個月后查近,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡勋颖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年嗦嗡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饭玲。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡侥祭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茄厘,到底是詐尸還是另有隱情矮冬,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布次哈,位于F島的核電站胎署,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窑滞。R本人自食惡果不足惜琼牧,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哀卫。 院中可真熱鬧巨坊,春花似錦、人聲如沸此改。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共啃。三九已至占调,卻和暖如春暂题,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背究珊。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工薪者, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苦银。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓啸胧,卻偏偏與公主長得像赶站,于是被迫代替她去往敵國和親幔虏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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