亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:48:28
字體:
供稿:網(wǎng)友

一、引言

函數(shù)是有特定功能的代碼段,函數(shù)會(huì)有一個(gè)特定的名稱調(diào)用時(shí)來使用。Swift提供了十分靈活的方式來創(chuàng)建與調(diào)用函數(shù)。事實(shí)上在Swift,每個(gè)函數(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ù)和返回值決定一個(gè)函數(shù)的類型,在調(diào)用函數(shù)時(shí),使用函數(shù)名來進(jìn)行調(diào)用,示例如下:

//傳入一個(gè)名字 打印并將其返回func printName(name:String) -> String {  print(name)  return name}//進(jìn)行函數(shù)的調(diào)用printName("HS")

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

func onePuseTwo()->Int {  return 1+2}onePuseTwo()同樣也可以創(chuàng)建沒有返回值的函數(shù):func sayHello(){  print("Hello")}sayHello()

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

func tuples()->(Int,String){  return (1,"1")}tuples()

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

func func1(param:Int)->Int? {  guard(param>0)else{    return nil  }  return param}func1(0)func1(1)

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

func func1(count param:Int ,count2 param2:Int)->Int? {  //內(nèi)部依然使用param  guard(param>0)else{    return nil  }  return param}//外部調(diào)用使用countfunc1(count: 0,count2: 0)func1(count: 1,count2: 1)

其實(shí)Swift函數(shù)中的參數(shù)列表有這樣一個(gè)特點(diǎn),除了第一個(gè)參數(shù)外,之后的參數(shù)都默認(rèn)添加一個(gè)一個(gè)和內(nèi)部名稱相同的外部名稱,如果開發(fā)者不想使用這個(gè)外部名稱,使用_符號設(shè)置,示例如下:

func func2(param:Int,param2:Int,param3:Int) {  }//有外部名稱func2(0, param2: 0, param3: 0)func func3(param:Int,_ param2:Int,_ param3:Int) {  }//沒有外部名稱func3(0, 0, 0)

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

func func4(param:Int=1,param2:Int=2,param3:Int) {  print(param,param2,param3)}func4(3,param3:3)

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

func func5(param:Int...) {  for index in param {    print(index)  }}func5(1,2,3,4)

Swift中參數(shù)默認(rèn)是常量,在函數(shù)中是不能修改外部傳入?yún)?shù)的值得,如果有需求,需要將參數(shù)聲明成inout類型,示例如下:

func func6(inout param:Int) {  param = 10}var count = 1//實(shí)際上傳入的是參數(shù)地址func6(&count)print(count)

三、函數(shù)類型

函數(shù)是一種特殊的數(shù)據(jù)類型,每一個(gè)函數(shù)屬于一種數(shù)據(jù)類型,示例如下:

func func7(a:Int,_ b:Int)->Int{  return a+b}var addFunc:(Int,Int)->Int = func7addFunc(1,2)

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

func func7(a:Int,_ b:Int)->Int{  return a+b}var addFunc:(Int,Int)->Int = func7addFunc(1,2)func func8(param:Int,param2:Int,param3:(Int,Int)->Int) -> Int {  return param3(param,param2)}//傳入函數(shù)func8(1, param2: 2, param3: addFunc)//閉包的方式func8(2, param2: 2, param3:{ (a:Int,b:Int) -> Int in  return a*b  })

一個(gè)人函數(shù)也可以作為另一個(gè)函數(shù)的返回值,示例如下:

func func9()->(Int)->Int{  //Swift支持嵌套函數(shù)  func tmp(a:Int)->Int{    return a*a  }  return tmp}var myFunc = func9()myFunc(3)

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

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

var array = [3,21,5,2,64]func func1(param1:Int,param2:Int) -> Bool {  return param1>param2}//通過傳入函數(shù)的方式//array = [64,21,5,3,2]array = array.sort(func1)//通過閉包的方式//array = [2,3,5,21,64]array = array.sort({(param:Int,param2:Int)->Bool in            return param<param2          })

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

//將閉包的參數(shù)類型和返回值都省略array = array.sort({(p1,p2) in return p1>p2})

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

array = array.sort({(p1,p2) in  p1>p2})

看到上面的表達(dá)式,是不是有點(diǎn)小震驚,閉包表達(dá)式竟然可以簡寫成這樣!然而,你還是小看的Swift開發(fā)團(tuán)隊(duì),后面的語法規(guī)則會(huì)讓你明白什么是簡潔的極致??梢钥吹缴厦娴拇a實(shí)現(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í)際上也是多余的,閉包中會(huì)自動(dòng)生成一些參數(shù)名稱,和實(shí)際的參數(shù)數(shù)量向?qū)?yīng),例如上面sort函數(shù)中的閉包有兩個(gè)參數(shù),系統(tǒng)會(huì)自動(dòng)生成$0和$1這兩個(gè)參數(shù)名,開發(fā)者可以直接使用,因?yàn)閰?shù)列表都會(huì)省略了,那么也不再需要閉包關(guān)鍵字in來分隔參數(shù)列表與函數(shù)體,這時(shí),閉包的寫法實(shí)際上變成了如下的模樣:

array = array.sort({$0<$1})

你沒有看錯(cuò),加上左右的大括號,一共7個(gè)字符,完成了一個(gè)排序算法。除了Swift,我不知道是否還有第二種語言可以做到。拋開閉包不說,Swift中還有一種語法,其可以定義類型的運(yùn)算符方法,例如String類型可以通過=,<,>來進(jìn)行比較,實(shí)際上是String類中實(shí)現(xiàn)了這些運(yùn)算符方法,在某種意義上說,一個(gè)運(yùn)算符即類似與一個(gè)函數(shù),那么好了,sort函數(shù)中需要傳入的方法對于某些類型來說實(shí)際上只是需要一個(gè)運(yùn)算符,示例如下:

array = array.sort(>)

這次你可以真的震驚了,完成排序新算法只需要一個(gè)字符,不折不扣的一個(gè)字符。

五、Swift中閉包的更多特點(diǎn)

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

//閉包結(jié)尾func func2(param1:Int,param2:()->Void)->Void{  param2()  print("調(diào)用了func2函數(shù)")}func2(0){    print("閉包中的內(nèi)容")}

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

func func3(param:()->Void)->Void{  param()  print("調(diào)用了func3函數(shù)")}func3{  print("閉包中的內(nèi)容")}

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

func func3(@noescape param:()->Void)->Void{  param()  print("調(diào)用了func3函數(shù)")}func3{  print("閉包中的內(nèi)容")}

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

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

//自動(dòng)閉包演示var list = [1,2,3,4,5,6]//創(chuàng)建一個(gè)顯式閉包let closures = {  list.removeFirst()  list.append(7)}//將打印[1,2,3,4,5,6]print(list)//執(zhí)行閉包c(diǎn)losures()//將打印[2,3,4,5,6,7]print(list)func func4(closure:()->Void) -> Void {  //執(zhí)行顯式的閉包  closures()}func func5(@autoclosure auto:()->Void) -> Void {  //執(zhí)行自動(dòng)閉包  auto()}//顯式閉包 需要大括號func4(closures)//將打印[3,4,5,6,7,7]print(list)//將表達(dá)式自動(dòng)生成閉包func5(list.append(8))//將打印[3,4,5,6,7,7,8]print(list)

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

func func5(@autoclosure(escaping) auto:()->Void) -> Void {  //執(zhí)行自動(dòng)閉包  auto()}


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
一本大道久久精品懂色aⅴ| 亚洲人成在线播放| 另类图片亚洲另类| 一卡二卡三卡在线| 无码国产69精品久久久久网站| 久草在线新视觉| 捆绑调教一区二区三区| 国产人妻大战黑人20p| 毛片网站大全| 视频一区二区三区在线看免费看| 三级小视频在线观看| 欧美日韩一区二区不卡| 国产精品suv一区二区三区| 国产精品午夜国产小视频| 欧美日韩国产免费| 国产情侣av自拍| 免费的黄色av| 在线电影中文字幕| 任你弄在线视频免费观看| 国产一区二区三区四区五区美女| 国产精品99久久久久久www| 国产一区二区三区影院| 日韩欧美影院| 国产精品久久久久9999吃药| 日本中文在线一区| 成人在线视频区| 动漫美女无遮挡免费| 日韩精品第二页| 永久免费看片在线播放| 视频在线观看91| 国产精品白浆视频免费观看| 国产经典视频一区| 国产精品中文字幕久久久| 精品午夜一区二区三区| 国产乱精品一区二区三区| 国产麻豆视频| 国产在线观看18| 成人在线视频免费| 色久视频在线观看| 麻豆av在线免费观看| 2018高清国产日本一道国产| 日韩欧美在线观看一区二区三区| 你懂的在线观看视频| 精品国产一区二区三区免费| 久久只有这里有精品| 精品国产一区二区三区久久狼5月| 色香欲www7777综合网| 色哟哟免费在线观看| 国产高清精品软男同| 清纯唯美亚洲综合一区| 免费91麻豆精品国产自产在线观看| 亚洲成a人片在线不卡一二三区| 中文字幕av免费观看| 一区二区三区天堂av| 国产精品秘入口18禁麻豆免会员| 欧美一区二区三区播放老司机| 精品一区二区在线免费观看| 日韩高清不卡av| 免费毛片大全| 果冻天美麻豆一区二区国产| 一级特黄录像免费看| mm131美女视频| 伊人亚洲福利一区二区三区| 成人永久aaa| 欧美一区1区三区3区公司| 蜜桃av噜噜一区二区三区| 亚洲电影在线看| 黑人与亚洲人色ⅹvideos| 欧美少妇xxxx| 国产精品久久久久久久久久齐齐| 日韩成人免费在线| 免费日本黄色| 激情另类小说区图片区视频区| 欧美另类高清视频在线| 国产无遮挡免费视频| 国产不卡视频在线观看| 天天操夜夜爽| 欧美色图影院| 6—12呦国产精品| 在线观看成人影院| 99精品黄色片免费大全| 在线精品亚洲欧美日韩国产| 18欧美亚洲精品| 丁香花在线高清完整版视频| 国产一在线精品一区在线观看| 国产一区二区三区久久| 日韩av新片网| 中文字幕一区综合| 日韩一级片网站| 国产精品视频一区二区图片| 欧美日韩成人一区二区三区| 欧美久久久久久久久中文字幕| 成人h动漫精品一区二区下载| 欧美另类videosbestsex日本| 欧美日韩高清免费| 亚洲一区免费网站| 欧美午夜在线观看| 久久精品夜色噜噜亚洲a∨| 国产亚洲精品aa午夜观看| 欧美xoxoxo| 秋霞伦理一区| 免费av一区二区三区四区| 秋霞午夜一区二区三区视频| 洋洋成人永久网站入口| 日韩亚洲精品电影| 亚洲不卡一卡2卡三卡4卡5卡精品| 亚洲综合男人的天堂| 最新国产成人在线观看| 日韩高清中文字幕| 亚洲va久久久噜噜噜久久| 蜜桃在线视频| 欧美性受xxxx黑人xyx性爽| 亚洲精品动态| 日韩中文字幕电影| 欧美在线free| 久久久成人影院| japan高清日本乱xxxx| 国产一二三区在线播放| 欧美刺激脚交jootjob| 成人免费在线观看网站| 久久婷婷国产综合尤物精品| 久久久久久久极品| 免费裸体视频网站| 久久精品亚洲| 久久精品免费看| 国产成人激情小视频| 成人四虎影院| 久久老司机精品视频| 亚洲欧美日韩国产综合精品二区| 99久久精品免费看国产| 91久久精品一区二区| 欧美福利视频一区二区| 亚洲国产综合在线| 捆绑变态av一区二区三区| 国产欧美日韩综合一区在线观看| 亚洲成人免费在线视频| 欧美三级黄美女| 91小视频在线| 亚洲五月六月| 亚洲欧美综合自拍| 在线观看的黄色网址| 欧美福利视频一区| 国产精品久久久久一区二区国产| 少妇精品久久久久久久久久| 亚洲电影在线一区二区三区| 欧美激情免费观看| 日韩经典一区| 亚洲国产欧美在线成人app| 中文字幕丰满孑伦无码专区| 国产suv精品一区二区| 三年中国中文观看免费播放| 国产精品美女在线播放| 久久精品av| 成人9ⅰ免费影视网站| 日本加勒比一区| 国产美女高潮久久白浆| 亚洲精品911| 欧美一区二区三区影院| 快播日韩欧美| 天天躁日日躁狠狠躁超碰2020| 91成人在线观看国产| 亚洲色图在线播放| 日本欧美黄色| 黄色动漫在线免费观看| 91免费的视频在线播放| 国产亚洲精品久| 亚洲精品免费在线看| 99理论电影网| 亚洲精品20p| 国产成人在线播放视频| 久久久人成影片一区二区三区观看| 免费视频网站在线观看入口| 91禁男男在线观看| 国产农村妇女毛片精品久久莱园子| 欧美人与牲动交xxxxbbbb| 主播大秀视频在线观看一区二区| 国产视频在线观看视频| 88国产精品视频一区二区三区| 精品蜜桃一区二区三区| 日韩一级网站| 欧美精品777| 国产毛片一区| 久久午夜国产精品| 在线观看污污网站| 亚洲第一精品自拍| 欧美性生活大片免费观看网址| 国内精品久久久久久久久| 国产美女在线看| 91高清视频| 欧美日韩一二区| 成人亚洲欧美| 精品人妻久久久久一区二区三区| 日韩在线观看免费高清完整版| 久久久久久久久久久97| 亚洲乱亚洲乱妇| 91精品国产精品| 四虎精品在线| 福利地址发布页| 免费人成精品欧美精品| 日韩免费影院| 国产探花在线观看视频| 午夜成人在线视频| 一个人看的视频www| 国产二区一区| juliaann成人作品在线看| 国产欧美一区二区三区在线看| 午夜欧美精品久久久久久久| 亚洲黄色免费在线观看| 精品在线你懂的| 91在线免费观看网站| 特黄aaaaaaaaa毛片免费视频| 国产在线视频在线| 欧美视频在线观看一区二区| 久久99精品国产99久久| 欧洲一区二区三区免费视频| 亚洲欧美国产77777| 国产精品国产三级国产普通话对白| 欧美日韩国产免费一区二区| 亚洲视频高清| 亚洲毛片欧洲毛片国产一品色| 黑人精品无码一区二区三区AV| 亚洲午夜精品| 999国产精品亚洲77777| 国产xxxx做受性欧美88| 美日韩精品视频免费看| 在线小视频网址| 免费国产阿v视频在线观看| 国产97在线观看| 日本不卡一区二区三区| 开心快乐六月丁香婷婷| 国产网站av| 国产91精品最新在线播放| youjizz久久| 中文字幕在线天堂| 无码人妻少妇伦在线电影| 国精品无码一区二区三区| 久久久午夜精品理论片中文字幕| 天堂av免费在线观看| 狂野欧美激情性xxxx| 91精品免费久久久久久久久| 国产男男gay体育生网站| 亚洲精品国产精品国自产在线| 欧美美女色图| 色综合久久五月天| 亚洲性日韩精品一区二区| 狠狠躁夜夜躁av无码中文幕| 香蕉精品视频在线观看| 91精品国产91久久久久游泳池| 中文字幕视频在线播放| 亚洲欧洲国产精品久久| 欧美96在线| 国内自拍视频一区二区三区| 18网站在线观看| 亚洲成在线观看| 激情开心成人网| 在线播放黄色网址| 图片一区二区| 香蕉成人app| 粉嫩精品导航导航| 亚洲欧美日韩国产成人精品影院| 黄色av网址在线免费观看| 都市激情亚洲综合| 欧美日本高清一区| 秋霞成人影院| 91色视频在线| 欧美78videosex性欧美| 在线视频观看一区| 国产真人真事毛片| 国产成人精品免费看| 中国一级特黄视频| 亚洲色偷偷色噜噜狠狠99网| 最新国产成人av网站网址麻豆| 夜色av.com| 日韩一区二区免费视频| 欧美大片日本大片免费观看| 国产一区二区三区黄| 韩国一区二区三区| 久久久久久日本一区99| 国产精品久久久爽爽爽麻豆色哟哟| 久久嫩草精品久久久精品| 久久99精品国产自在现线| 国产精品a久久久久久| 日韩成人av网址| 亚洲欧美精品一区二区| 欧美军同video69视频| 日本精品一区二区三区四区| 国产在线色视频| 免费h视频在线观看| 精品国产成人在线| 国产人妻黑人一区二区三区| 日韩在线一区二区三区四区| 在线播放中文一区| 中文字幕欧美国产| 日韩三级在线免费观看| 小早川怜子久久精品中文字幕| 亚洲三级免费电影| 亚洲国内精品在线| 98精品国产高清在线xxxx天堂| 一本久道久久综合狠狠爱| 亚洲成人一区在线观看| 神马影视一区二区| 日本精品600av| 麻豆国产欧美日韩综合精品二区| 欧美日本成人| 亚洲人成午夜免电影费观看| 97影院理论片在线播放| 99在线首页视频| 亚洲av无码国产精品麻豆天美| 亚洲综合免费观看高清完整版在线| 无码人妻精品中文字幕| 美女把尿口扒开给男人桶视频| 国产999精品久久久久久绿帽| 超污黄色软件| 成人频在线观看| yourporn在线观看视频| 日韩a级在线观看| 亚洲福利久久| 丰满少妇又爽又紧又丰满69| 成人性做爰aaa片免费看不忠| 国产福利视频一区| 91精品少妇一区二区三区蜜桃臀| 亚洲精品一区国产| 国模一区二区三区| 亚洲色大成网站www| 一区精品在线播放| 欧美一区二区视频免费观看| 色天使在线观看| xxxcom在线观看|