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)題东抹,歡迎指正!