Sequence in Swift

Swift 語(yǔ)言中提供了一種 for .. in 語(yǔ)法的形式,用于遍歷集合又跛,比如對(duì)于 Array 類型碍拆,就可以用 for .. in 來(lái)進(jìn)行遍歷。我們也可以讓我們自己的類也支持這個(gè)語(yǔ)法慨蓝。這里主要是實(shí)現(xiàn)Sequence協(xié)議感混,具體怎么實(shí)現(xiàn)呢,我們來(lái)舉個(gè)例子礼烈。

首先弧满,定義一個(gè)我們自己的類Person

class Person{

? ? ? var name:String = ""

? ? ? var sex:String = ""

? ? ?init(name:String,sex:String){

? ? ? ? ? ? self.name = name

? ? ? ? ? ? self.sex = sex

? ? ?}

}

接下來(lái),我們定義一個(gè)PersonList類此熬,讓其實(shí)現(xiàn)Sequence協(xié)議庭呜,這里需要實(shí)現(xiàn)兩處,一個(gè)是屬性iterator,另一個(gè)是方法makeIterator()犀忱,而這里又需要iteratorType,具體是這樣的:

classPersonList:Sequence{

privatevarpersonList:[Person]?

init() {

self.personList= [Person]()

}

typealiasIterator =PersonListIterator

funcmakeIterator() ->PersonListIterator{

returnPersonListIterator(personList:self.personList!)

}

funcaddPerson(person:Person){

self.personList?.append(person)

}

}

下面需要實(shí)現(xiàn)PersonListIteratorPerson募谎,該類實(shí)現(xiàn)IteratorProtocol協(xié)議,有兩個(gè)地方需要實(shí)現(xiàn)阴汇,一個(gè)是屬性Element,一個(gè)是next()方法数冬,即如何進(jìn)行遍歷:

classPersonListIterator:IteratorProtocol{

typealiasElement =Person

varcurrentIndex:Int=0

varpersonList:[Person]?

init(personList:[Person]) {

self.personList= personList

}

funcnext() ->Person? {

guardletlist =personListelse{

returnnil

}

ifcurrentIndex

letelement = list[currentIndex]

currentIndex+=1

returnelement

}

else

{

returnnil

}

}

}

創(chuàng)建一個(gè)我們建立的personlist對(duì)象,進(jìn)行遍歷:

varpersonlist =PersonList()

personlist.addPerson(person:Person(name:"aa",sex:"23"))

personlist.addPerson(person:Person(name:"bb",sex:"32"))

personlist.addPerson(person:Person(name:"cc",sex:"28"))

forpersoninpersonlist{

print("\(person.name),\(person.sex)")

}

你會(huì)看到結(jié)果

證明我們成功實(shí)現(xiàn)了利用for..in來(lái)遍歷對(duì)象搀庶,那么我們換個(gè)遍歷方式拐纱,倒序遍歷,只需改變next()方法即可哥倔,那么我們來(lái)創(chuàng)建一個(gè)倒序遍歷的iterator類

classPersonListReverseIterator:IteratorProtocol{

typealiasElement =Person

varpersonList:[Person]?

varcurrentIndex:Int=0

init(personList:[Person]) {

self.personList= personList

currentIndex= personList.count-1

}

funcnext() ->Person? {

guardletlist =personListelse{

returnnil

}

ifcurrentIndex>=0{

letelement = list[currentIndex]

currentIndex-=1

returnelement

}

else

{

returnnil

}

}

}

然后秸架,改變PersonList中Iterator類型,即可實(shí)現(xiàn)咆蒿。

有什么問(wèn)題东抹,歡迎指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜡秽,一起剝皮案震驚了整個(gè)濱河市府阀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芽突,老刑警劉巖试浙,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寞蚌,居然都是意外死亡田巴,警方通過(guò)查閱死者的電腦和手機(jī)钠糊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壹哺,“玉大人抄伍,你說(shuō)我怎么就攤上這事」芟” “怎么了截珍?”我有些...
    開(kāi)封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)箩朴。 經(jīng)常有香客問(wèn)我岗喉,道長(zhǎng),這世上最難降的妖魔是什么炸庞? 我笑而不...
    開(kāi)封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任钱床,我火速辦了婚禮,結(jié)果婚禮上埠居,老公的妹妹穿的比我還像新娘查牌。我一直安慰自己滥壕,他們只是感情好纸颜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捏浊,像睡著了一般懂衩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上金踪,一...
    開(kāi)封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音牵敷,去河邊找鬼胡岔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枷餐,可吹牛的內(nèi)容都是我干的靶瘸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼毛肋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怨咪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起润匙,我...
    開(kāi)封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诗眨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后孕讳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匠楚,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巍膘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芋簿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峡懈。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖与斤,靈堂內(nèi)的尸體忽然破棺而出肪康,到底是詐尸還是另有隱情,我是刑警寧澤撩穿,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布梅鹦,位于F島的核電站,受9級(jí)特大地震影響冗锁,放射性物質(zhì)發(fā)生泄漏齐唆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一冻河、第九天 我趴在偏房一處隱蔽的房頂上張望箍邮。 院中可真熱鬧,春花似錦叨叙、人聲如沸锭弊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)味滞。三九已至,卻和暖如春钮呀,著一層夾襖步出監(jiān)牢的瞬間剑鞍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工爽醋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚁署,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓蚂四,卻偏偏與公主長(zhǎng)得像光戈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遂赠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • begin with one quickSort 之前在學(xué)習(xí)時(shí)曾看到swift如此簡(jiǎn)潔地表達(dá)出了快排算法久妆。 時(shí)雖嘆...
    KisugiRui閱讀 1,541評(píng)論 0 2
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,278評(píng)論 1 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)跷睦,斷路器筷弦,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 吾聞聽(tīng)閱讀 162評(píng)論 3 2
  • 今天是“三八婦女節(jié)”,我想該讓媽媽怎樣過(guò)一個(gè)快快樂(lè)樂(lè)的節(jié)日呢送讲?說(shuō)實(shí)話奸笤,我還沒(méi)有做過(guò)一件讓媽媽感動(dòng)的事情惋啃,該怎么做...
    章國(guó)懿閱讀 213評(píng)論 0 2