窺探 Swift 之 函數(shù)與閉包的應(yīng)用實(shí)例

今天的博客算是比較基礎(chǔ)的元镀,還是那句話露泊,基礎(chǔ)這東西在什么時(shí)候都是最重要的。說到函數(shù)乖阵,只要是寫過程序就肯定知道函數(shù)是怎么回事宣赔,今天就來討論一下Swift中的函數(shù)的特性以及Swift中的閉包。今天的一些小實(shí)例中回類比一下Objective-C中的函數(shù)的寫法等等瞪浸。Swift中的函數(shù)還是有許多好用的特性的儒将,比如輸入?yún)?shù),使用元組返回多個(gè)值对蒲, 定義形參名钩蚊,設(shè)定默認(rèn)參數(shù)以及可變參數(shù)等等一些好用的特性贡翘。而在Swift中的閉包就是Objective-C中的Block, 除了語法不通外,兩者的用法是一樣的砰逻。廢話少說鸣驱,開始今天的主題,先搞一搞Swift中的函數(shù)蝠咆,然后在搞一搞Swift中的閉包踊东。

一.Swift中的函數(shù)

1. 函數(shù)的定義與使用

在介紹Swift中的函數(shù)之前,我想用Objective-C中的一個(gè)簡(jiǎn)單的加法函數(shù)來作為引子刚操,然后類比著實(shí)現(xiàn)一下Swift中相同功能的函數(shù)闸翅。關(guān)于函數(shù)定義就比較簡(jiǎn)單了,就是一些語法的東西菊霜,下面的代碼片段是Objc中求兩個(gè)整數(shù)之和的函數(shù)缎脾,并返回兩個(gè)數(shù)的和。

1

2

3-?(NSInteger)sumNumber1:(NSInteger)?number1

number2:(NSInteger)?number2?{returnnumber1?+?number2;

}

函數(shù)的功能比較簡(jiǎn)單了占卧,就是把兩個(gè)整數(shù)傳進(jìn)來遗菠,然后返回兩個(gè)整數(shù)的和。接下來將用Swift語言實(shí)現(xiàn)华蜒,也好通過這個(gè)實(shí)例來熟悉一下Swift語言中定義函數(shù)的語法辙纬。下方是Swift語言中求兩個(gè)整數(shù)之和的函數(shù)。語法比較簡(jiǎn)單了叭喜,在Swift中定義函數(shù)贺拣,我們會(huì)使用到關(guān)鍵字func來聲明函數(shù)。

1

2

3

4//函數(shù)定義

func?sum?(number1:Int,?number2:Int)?->?Int{

returnnumber1?+?number2;

}

用文字來描述Swift定義基本函數(shù)的語法就是:func函數(shù)名(形參列表) ->返回值類型{函數(shù)體}捂蕴,這樣你就可以定義一個(gè)函數(shù)了譬涡。當(dāng)然,函數(shù)定義時(shí)還有好多其他的用法啥辨,下面會(huì)詳細(xì)介紹涡匀。上面函數(shù)的調(diào)用方法如下:

1

let?sumTwoNubmer?=?sum(2,?number2:?3);

2. 函數(shù)中的形參列表

關(guān)于函數(shù)中的形參列表還是有必要提上一嘴的,因?yàn)樾螀⒘斜碜鳛楹瘮?shù)數(shù)據(jù)源之一溉知,所以把參數(shù)列表好好的搞一搞還是很有必要的陨瘩。參數(shù)列表也有很多好用的使用方式,接下來詳細(xì)的介紹一下函數(shù)的形參列表级乍。

(1) 默認(rèn)的形參是常量(let)

在函數(shù)的形參列表中舌劳,默認(rèn)的形參是常量捌议。也就是相當(dāng)于用let關(guān)鍵字對(duì)形參進(jìn)行修飾了柬焕。我們可以做個(gè)試驗(yàn)更啄,把上面加法函數(shù)做一個(gè)修改秘噪,在加法函數(shù)中對(duì)number1進(jìn)行加1操作健民,你會(huì)得到一個(gè)錯(cuò)誤蜡豹,這個(gè)錯(cuò)誤的大體意思就是“number1是不可被修改的捂齐,因?yàn)樗莑et類型的常量”汗捡。并且編譯器還給人出了Fix-it(修復(fù))的方案,就是在number1前面使用var關(guān)鍵字進(jìn)行修飾脸侥,使其成為變量建邓,這樣才可以修改其值。

上面說這么多睁枕,一句話:形參默認(rèn)是常量官边,如果你想讓其是變量,那么你可以使用var關(guān)鍵字進(jìn)行修飾外遇,這樣被關(guān)鍵字var修飾的變量在函數(shù)中就可以被修改注簿。下方就是報(bào)的這個(gè)錯(cuò)誤,和編譯器提供的解決方案跳仿。(在Objc中默認(rèn)可以在函數(shù)中改變形參的值)

(2)給形參命名

為了代碼的可讀性和可維護(hù)性诡渴,我們?cè)诙x函數(shù)時(shí),需要為每個(gè)參數(shù)名一個(gè)名字菲语,這樣調(diào)用者見名知意妄辩,很容易就知道這個(gè)參數(shù)代表什么意思了。接下來還是在上述加法函數(shù)中進(jìn)行修改山上,為每個(gè)參數(shù)名一個(gè)名字眼耀,并看一下調(diào)用方式。修改上面的函數(shù)佩憾,給第一個(gè)形參命名成numberOne, 第二個(gè)形參為numberTwo, 下方是修改后的函數(shù)哮伟。 緊接著sum()函數(shù)的調(diào)用方式也會(huì)有所改變,在調(diào)用函數(shù)時(shí)編譯器會(huì)給出參數(shù)的名稱妄帘,這樣調(diào)用者一目了然楞黄。

1

2

3

4

5

6//函數(shù)定義

func?sum?(numberOne?number1:Int,?numberTwo?number2:Int)?->?Int{

returnnumber1?+?number2;

}

let?sumTwoNubmer?=?sum(numberOne:?10,?numberTwo:?20);

調(diào)用上述函數(shù)時(shí),下方是編譯器給出的提示抡驼,一目了然呢鬼廓。

關(guān)于Swift中參數(shù)名的內(nèi)容,要說明的是在Swift1.0的時(shí)候婶恼,你可以在參數(shù)前面添加上#號(hào)桑阶,然后參數(shù)名就與變量(或者常量)的名字相同,而Swift2.0后這個(gè)東西去掉了勾邦,因?yàn)槟J(rèn)就相當(dāng)于Swift1.0中添加#號(hào)。

(3) 函數(shù)的傳參與傳引用

先暫且這么說著割择,在C語言的函數(shù)中可以給函數(shù)傳入?yún)?shù)眷篇,或者傳入實(shí)參的內(nèi)存地址就是所謂的傳引用。如果傳入的是引用的話荔泳,在函數(shù)中對(duì)值進(jìn)行修改的話蕉饼,那么出了函數(shù)虐杯,這個(gè)被修改的值是可以被保留的。在Swift中也是可以的昧港,不過你需要使用inout關(guān)鍵字修飾形參擎椰,并且在使用該函數(shù)時(shí),用&來修飾创肥。這一點(diǎn)和C語言中類似达舒,&就是取地址符。下方是inout使用的一個(gè)小實(shí)例叹侄。

1

2

3

4

5func?incrementStepTwo?(inout?myNumber:Int)?{

myNumber?+=?2

}

varmyTestNumber?=?6

incrementStepTow(&myTestNumber)//myTestNumber?=?8

myTestNumber變量經(jīng)過incrementStepTwo()函數(shù)后巩搏,其值就會(huì)增加2。當(dāng)然前提是myTestNumber是變量趾代,如果myTestNumber是常量的話贯底,那么對(duì)不起,調(diào)用該函數(shù)就會(huì)報(bào)錯(cuò)撒强,下面是把var改成let后IDE給的錯(cuò)誤提示禽捆。錯(cuò)誤原因很顯然是你動(dòng)了一個(gè)不該動(dòng)的值,也就是常量不可再次被修改的飘哨。

(4) 不定參數(shù)函數(shù)

不定參數(shù)函數(shù)也就是形參的個(gè)數(shù)是不定的睦擂,但是形參的類型必須是相同的。不定形參在使用時(shí)怎么取呢杖玲?不定個(gè)數(shù)的形參實(shí)際上是一個(gè)數(shù)組顿仇,我們可以通過for循環(huán)的形式來遍歷出每個(gè)形參的值,然后使用就可以了摆马。下方incrementMultableAdd()函數(shù)的形參的個(gè)數(shù)是不定的臼闻,其功能是求多個(gè)整數(shù)的和。在函數(shù)中我們只需遍歷每個(gè)參數(shù)囤采,然后把每個(gè)參數(shù)進(jìn)行相加述呐,最后返回所求的和即可。函數(shù)比較簡(jiǎn)單蕉毯,再此就不在啰嗦了乓搬。

(5) 默認(rèn)形參值

在Swift語言中是支持給形參賦初始值的,這一點(diǎn)在其他一些編程語言中也是支持的代虾。但是Objective-C這么看似古老的語言中就不支持給形參指定初始值进肯,在Swift這門現(xiàn)代編程語言中是支持這一特性的。默認(rèn)參數(shù)要從參數(shù)列表后開始為參數(shù)指定默認(rèn)值棉磨,不然就會(huì)報(bào)錯(cuò)江掩。下方就是為函數(shù)的形參指定默認(rèn)參數(shù)的示例。一個(gè)表白的方法sayLove(), 形參youName默認(rèn)是“山伯”, 形參loverName默認(rèn)是“英臺(tái)”环形。 緊接著是sayLove函數(shù)的三種不同的調(diào)用方式策泣,在調(diào)用函數(shù)時(shí)你可以不傳參數(shù),可以傳一個(gè)參數(shù)抬吟,當(dāng)然傳兩個(gè)也是沒問題的萨咕。

因?yàn)楹瘮?shù)的每個(gè)參數(shù)都是有名字的,在含有默認(rèn)參數(shù)的函數(shù)調(diào)用時(shí)火本,可以給任意一個(gè)參數(shù)進(jìn)行傳值危队,其他參數(shù)取默認(rèn)值,這也是Swift的一大特色之一发侵,具體請(qǐng)看如下簡(jiǎn)單的代碼示例:

3.函數(shù)類型

每個(gè)函數(shù)都有自己的所屬類型交掏,函數(shù)類型說白了就是如果兩個(gè)函數(shù)參數(shù)列表相同以及返回值類型相同,那么這兩個(gè)函數(shù)就有著相同的函數(shù)類型刃鳄。在Swift中可以定義一個(gè)變量或者常量來存儲(chǔ)一個(gè)函數(shù)的類型盅弛。接下來將用過一個(gè)實(shí)例還介紹一下函數(shù)類型是個(gè)什么東西。

(1) 首先創(chuàng)建兩個(gè)函數(shù)類型相同的函數(shù)叔锐,一個(gè)函數(shù)返回兩個(gè)整數(shù)的差值挪鹏,另一個(gè)函數(shù)返回兩個(gè)整數(shù)的乘積。當(dāng)然這兩個(gè)函數(shù)比較簡(jiǎn)單愉烙,直接上代碼:

1

2

3

4

5

6

7

8//現(xiàn)定義兩個(gè)函數(shù)類型相同的函數(shù)

func?diff?(number1:Int,?number2:Int)?->?Int?{

returnnumber1?-?number2;

}

func?mul?(number1:Int,?number2:Int)?->?Int?{

returnnumber1?*?number2;

}

(2) 函數(shù)定義好后讨盒,接著要定義個(gè)一個(gè)枚舉來枚舉每種函數(shù)的類型,下面定義這個(gè)枚舉在選擇函數(shù)時(shí)會(huì)用到步责,枚舉定義如下:

1

2

3

4

5//定義兩種計(jì)算的枚舉類型

enum?CountType:Int?{

caseDiffCount?=?0

caseMulCount

}

(3) 接下來就是把(1)和(2)中定義的東西通過一個(gè)函數(shù)來組合起來返顺。說白了,就是定義個(gè)函數(shù)來通過枚舉值返回這個(gè)枚舉值所對(duì)應(yīng)的函數(shù)類型蔓肯。有時(shí)候說多了容易犯迷糊遂鹊,就直接上代碼得了。下方函數(shù)的功能就是根據(jù)傳進(jìn)來的枚舉值來返回相應(yīng)的函數(shù)類型蔗包。

1

2

3

4

5

6

7

8

9

10

11

12

13//選擇類型的函數(shù)秉扑,并返回相應(yīng)的函數(shù)類型

func?choiseCountType(countType:CountType)?->?((Int,?Int)?->?Int)?{

//函數(shù)類型變量

varmyFuncType:(Int,?Int)?->?Int

switchcountType?{

case.DiffCount:

myFuncType?=?diff

case.MulCount:

myFuncType?=?mul

}

returnmyFuncType;

}

(4) 接下來就是使用(3)中定義的函數(shù)了,首先我們需要定義一個(gè)相應(yīng)函數(shù)類型((Int,Int) ->Int)的變量來接收choiseCountType()函數(shù)中返回的函數(shù)類型调限,然后調(diào)用該函數(shù)類型變量舟陆,在Playground中執(zhí)行的結(jié)果如下:

4.函數(shù)嵌套

我們可以把 3 中的代碼使用函數(shù)嵌套進(jìn)行重寫,在Swift中是支持函數(shù)嵌套的耻矮。 所以可以吧3.1和3.2中的函數(shù)放到3.3函數(shù)中的秦躯,所以我們可以對(duì)上述代碼使用函數(shù)嵌套進(jìn)行重寫。使用函數(shù)嵌套重寫后的代碼如下所示淘钟,當(dāng)然宦赠,choiseCountType()函數(shù)的調(diào)用方式?jīng)]用發(fā)生改變陪毡,重寫后的調(diào)用方式和3.4中的調(diào)用方式是一樣一樣的米母。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24//選擇類型的函數(shù)勾扭,并返回相應(yīng)的函數(shù)類型

func?choiseCountType(countType:CountType)?->?((Int,?Int)?->?Int)?{

//現(xiàn)定義兩個(gè)函數(shù)類型相同的函數(shù)

func?diff?(number1:Int,?number2:Int)?->?Int?{

returnnumber1?-?number2;

}

func?mul?(number1:Int,?number2:Int)?->?Int?{

returnnumber1?*?number2;

}

//函數(shù)類型變量

varmyFuncType:(Int,?Int)?->?Int

switchcountType?{

case.DiffCount:

myFuncType?=?diff

case.MulCount:

myFuncType?=?mul

}

returnmyFuncType;

}

二. 閉包

說道Swift中的閉包呢,不得不提的就是Objective-C中的Block, 其實(shí)兩者是一個(gè)東西铁瞒,使用方式以及使用場(chǎng)景都是相同的妙色。我們完全可以類比著Objective-C中的Block來介紹一下Swift中的Closure(閉包)。其實(shí)就是匿名函數(shù)慧耍。接下來的這段內(nèi)容身辨,先介紹一下Swift中Closure的基本語法,然后在類比著ObjC中的Block窺探一下Closure的使用場(chǎng)景芍碧。

1.Closure變量的聲明

Closure就是匿名函數(shù)煌珊,我們可以定義一個(gè)閉包變量,而這個(gè)閉包變量的類型就是我們上面介紹的“函數(shù)類型”泌豆。定義一個(gè)閉包變量其實(shí)就是定義一個(gè)特定函數(shù)類型的變量定庵,方式如下。因?yàn)镃losure變量沒有賦初始值踪危,所以我們把其聲明為可選類型的變量蔬浙。在使用時(shí),用!強(qiáng)制打開即可贞远。

1

varmyCloure0:((Int,?Int)?->?Int)?

除了上面的方式外畴博,我們還用另一種常用的聲明閉包變量的方式。那就是使用關(guān)鍵字typealias定義一個(gè)特定函數(shù)類型蓝仲,我們就可以拿著這個(gè)類型去聲明一個(gè)Closure變量了俱病,如下所示

1

2

3//定義閉包類型?(就是一個(gè)函數(shù)類型)

typealias?MyClosureType?=?(Int,?Int)?->?Int

varmyCloure:MyClosureType?

2. 給Closure變量賦值

給Closure變量賦值,其實(shí)就是把一個(gè)函數(shù)體賦值給一個(gè)函數(shù)類型的變量袱结,和函數(shù)的定義區(qū)別不大亮隙。但是給閉包變量賦值的函數(shù)體中含有參數(shù)列表,并且參數(shù)列表和真正的函數(shù)體之間使用關(guān)鍵字in來分割擎勘。 閉包可選變量的調(diào)用方式與普通函數(shù)沒什么兩樣咱揍,唯一不同的是這個(gè)函數(shù)需要用!來強(qiáng)制打開才可以使用。賦值和調(diào)用方式如下棚饵。

3. 閉包回調(diào)的應(yīng)用實(shí)例

暫且先稱作閉包回調(diào)吧煤裙,其實(shí)就是Objc中的Block回調(diào)。在Swift中的閉包回調(diào)和Objc中的Block回調(diào)用法一致噪漾,下方將會(huì)通過一個(gè)實(shí)例來介紹一下閉包的應(yīng)用之一硼砰。下方會(huì)創(chuàng)建兩個(gè)視圖控制器,我們暫且稱為FirstViewController和SecondViewController欣硼。在FirstViewController上有一個(gè)Label和一個(gè)Button, 這個(gè)Button用來跳轉(zhuǎn)到SecondViewController, 而這個(gè)Label用來顯示從SecondViewController中回調(diào)過來的值题翰。 而SecondViewController也有一個(gè)TextField和一個(gè)Button, 點(diǎn)擊Button就會(huì)把輸入框中的值通過閉包回調(diào)回傳到FirstViewController然后在FirstViewController上的Label顯示。

(1) 構(gòu)建這個(gè)實(shí)例的第一步要做的就是使用Stroyboard把我們所需的控件布局好,并且管理相應(yīng)的類豹障。當(dāng)然我們這個(gè)Demo的重點(diǎn)不在于如何去布局控件冯事,如何去關(guān)聯(lián)控件,以及如何去使用控件血公,所以上述的這些就不做贅述了昵仅。這個(gè)實(shí)例的重點(diǎn)在于如何使用Closure實(shí)現(xiàn)值的回調(diào)。下方是我們的控件布局和目錄結(jié)構(gòu)的截圖累魔,從Storyboard上的控件來看摔笤,功能也就一目了然了。點(diǎn)擊“FirstViewController” 上的“Go SecondViewController”按鈕垦写,就會(huì)跳轉(zhuǎn)到 “SecondViewController” 吕世。 在SecondViewController視圖上的輸入框輸入數(shù)值,點(diǎn)擊Back按鈕返回到FirstViewController, 同時(shí)把輸入框中的文本通過閉包回調(diào)的形式回傳過來在FristViewController的label上顯示梯投。大致就這個(gè)簡(jiǎn)單的功能命辖。

(2)FirstViewController.swift中的內(nèi)容

FirstViewController.swift中的內(nèi)容比較簡(jiǎn)單,就關(guān)聯(lián)一個(gè)Label控件和一個(gè)按鈕點(diǎn)擊的事件晚伙,點(diǎn)擊按鈕就會(huì)跳轉(zhuǎn)到SecondViewController吮龄,具體代碼如下,在此就不啰嗦了咆疗,請(qǐng)看代碼中的注釋漓帚。下方代碼重要的一點(diǎn)是在跳轉(zhuǎn)到SecondViewController時(shí)要實(shí)現(xiàn)其提供的閉包回調(diào),以便接受回傳過來的值午磁。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36//

//??FirstViewController.swift

//??SwiftDemo

//

//??Created?by?Mr.LuDashi?on?15/11/18.

//??Copyright???2015年?ZeluLi.?All?rights?reserved.

//

import?UIKit

class?FirstViewController:?UIViewController?{

@IBOutletvarshowTextLabel:?UILabel!//展示回調(diào)過來的文字信息

override?func?viewDidLoad()?{

super.viewDidLoad()

}

override?func?didReceiveMemoryWarning()?{

super.didReceiveMemoryWarning()

}

//點(diǎn)擊按鈕跳轉(zhuǎn)到SecondViewController

@IBAction?func?tapGoSecondViewControllerButton(sender:?UIButton)?{

//從Storyboard上加載SecondViewController

let?secondVC?=?UIStoryboard(name:"Main",?bundle:?NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("SecondViewController")as!?SecondViewController

//實(shí)現(xiàn)回調(diào)尝抖,接收回調(diào)過來的值

secondVC.setBackMyClosure?{?(inputText:String)?->?Voidin

self.showTextLabel.text?=?inputText

}

//push到SecondViewController

self.navigationController?.pushViewController(secondVC,?animated:true)

}

}

(3) SecondViewController.swift中的內(nèi)容

SecondViewController.swift中的內(nèi)容也不麻煩,就是除了關(guān)聯(lián)控件和事件外迅皇,還定義了一個(gè)閉包類型(函數(shù)類型)昧辽,然后使用這個(gè)特定的函數(shù)類型聲明了一個(gè)此函數(shù)類型對(duì)應(yīng)的變量。我們可以通過這個(gè)變量來接受上個(gè)頁面?zhèn)鬟^來的閉包體登颓,從而把用戶輸入的值搅荞,通過這個(gè)閉包體回傳到上個(gè)頁面。具體代碼實(shí)現(xiàn)如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41//

//??SecondViewController.swift

//??SwiftDemo

//

//??Created?by?Mr.LuDashi?on?15/11/18.

//??Copyright???2015年?ZeluLi.?All?rights?reserved.

//

import?UIKit

typealias?InputClosureType?=?(String)?->?Void//定義閉包類型(特定的函數(shù)類型函數(shù)類型)

class?SecondViewController:?UIViewController?{

@IBOutletvarinputTextField:?UITextField!//輸入框框咙,讓用戶輸入值咕痛,然后通過閉包回調(diào)到上一個(gè)頁面

varbackClosure:InputClosureType?//接收上個(gè)頁面穿過來的閉包塊

override?func?viewDidLoad()?{

super.viewDidLoad()

}

override?func?didReceiveMemoryWarning()?{

super.didReceiveMemoryWarning()

}

//閉包變量的Seter方法

func?setBackMyClosure(tempClosure:InputClosureType)?{

self.backClosure?=?tempClosure

}

@IBAction?func?tapBackButton(sender:?UIButton)?{

ifself.backClosure?!=?nil?{

let?tempString:String??=?self.inputTextField.text

iftempString?!=?nil?{

self.backClosure!(tempString!)

}

}

self.navigationController!.popViewControllerAnimated(true)

}

}

(4) 經(jīng)過上面的步驟這個(gè)實(shí)例已經(jīng)完成,接下來就是看一下運(yùn)行效果的時(shí)間了喇嘱。本來想做成Git動(dòng)態(tài)圖的茉贡,感覺實(shí)例功能簡(jiǎn)單,而且UI上也比較簡(jiǎn)單者铜,就沒做腔丧,還是看截圖吧放椰。運(yùn)行效果的截圖如下:

4.數(shù)組中常用的閉包函數(shù)

在Swift的數(shù)組中自帶了一些比較好用的閉包函數(shù),例如Map, Filter, Reduce愉粤。接下來就好好的看一下這些閉包砾医,用起來還是比較爽的。

(1) Map(映射)

說到Map的用法和功能科汗,不能不說的是如果你使用過ReactiveCocoa框架藻烤,那么對(duì)里邊的Sequence中的Map的使用方式并不陌生绷雏。其實(shí)兩者的使用方法和功能是極為相似的头滔。如果你沒使用過RAC中的Map,那也無關(guān)緊要涎显,接下來我們先上段代碼開看一下數(shù)組中的Map閉包函數(shù)坤检。

通過上面的代碼段以及運(yùn)行結(jié)果,我們不難看出期吓,map閉包函數(shù)的功能就是對(duì)數(shù)組中的每一項(xiàng)進(jìn)行遍歷早歇,然后通過映射規(guī)則對(duì)數(shù)組中的每一項(xiàng)進(jìn)行處理,最終的返回結(jié)果是處理后的數(shù)組(以一個(gè)新的數(shù)組形式出現(xiàn))讨勤。當(dāng)然箭跳,原來數(shù)組中的元素值是保持不變的,這就是map閉包函數(shù)的用法與功能潭千。

(2) Filter (過濾器)

Filter的用法還是比較好理解的谱姓,F(xiàn)ilter就是一個(gè)漏勺,就是用來過濾符合條件的數(shù)據(jù)的刨晴。在ReactiveCocoa中的Sequence也是有Filter的屉来,用法還是來過濾Sequence中的數(shù)據(jù)的。而在數(shù)組中的Filter用來過濾數(shù)組中的數(shù)據(jù)狈癞,并且返回新的數(shù)組茄靠,新的數(shù)組中存放的就是符合條件的數(shù)據(jù)。Filter的用法如下實(shí)例蝶桶,下方的實(shí)例就是一個(gè)身高的過濾慨绳,過濾掉身高小于173的人,返回大于等于173的身高數(shù)據(jù)真竖。

(3)Reduce

在ReactiveCocoa中也是有Reduce這個(gè)概念的脐雪,ReactiveCocoa中使用Reduce來合并消減信號(hào)量。在swift的數(shù)組中使用Reduce閉包函數(shù)來合并items, 并且合并后的Value疼邀。下方的實(shí)例是一個(gè)Salary的數(shù)組喂江,其中存放的是每個(gè)月的薪水。我們要使用Reduce閉包函數(shù)來計(jì)算總的薪水旁振。下方是DEMO的截圖:

引自于:http://www.cocoachina.com/swift/20160106/14862.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末获询,一起剝皮案震驚了整個(gè)濱河市涨岁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吉嚣,老刑警劉巖梢薪,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尝哆,居然都是意外死亡秉撇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門秋泄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琐馆,“玉大人,你說我怎么就攤上這事恒序∈蒴铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵歧胁,是天一觀的道長滋饲。 經(jīng)常有香客問我,道長喊巍,這世上最難降的妖魔是什么屠缭? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮崭参,結(jié)果婚禮上呵曹,老公的妹妹穿的比我還像新娘。我一直安慰自己阵翎,他們只是感情好逢并,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郭卫,像睡著了一般砍聊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰军,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天玻蝌,我揣著相機(jī)與錄音,去河邊找鬼词疼。 笑死俯树,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贰盗。 我是一名探鬼主播许饿,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舵盈!你這毒婦竟也來了陋率?” 一聲冷哼從身側(cè)響起球化,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓦糟,沒想到半個(gè)月后筒愚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菩浙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年巢掺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲蜻。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陆淀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斋竞,到底是詐尸還是另有隱情倔约,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布坝初,位于F島的核電站,受9級(jí)特大地震影響钾军,放射性物質(zhì)發(fā)生泄漏鳄袍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一吏恭、第九天 我趴在偏房一處隱蔽的房頂上張望拗小。 院中可真熱鬧,春花似錦樱哼、人聲如沸哀九。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阅束。三九已至,卻和暖如春茄唐,著一層夾襖步出監(jiān)牢的瞬間息裸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工沪编, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呼盆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓蚁廓,卻偏偏與公主長得像访圃,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子相嵌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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