Swift 语言中提供了一种 for .. in 语法的形式,用于遍历集合,比如对于 Array 类型,就可以用 for .. in 来进行遍历。我们也可以让我们自己的类也支持这个语法。这里主要是实现Sequence协议,具体怎么实现呢,我们来举个例子。
首先,定义一个我们自己的类Person
class Person{
var name:String = ""
var sex:String = ""
init(name:String,sex:String){
self.name = name
self.sex = sex
}
}
接下来,我们定义一个PersonList类,让其实现Sequence协议,这里需要实现两处,一个是属性iterator,另一个是方法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)
}
}
下面需要实现PersonListIteratorPerson,该类实现IteratorProtocol协议,有两个地方需要实现,一个是属性Element,一个是next()方法,即如何进行遍历:
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
}
}
}
创建一个我们建立的personlist对象,进行遍历:
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)")
}
你会看到结果
证明我们成功实现了利用for..in来遍历对象,那么我们换个遍历方式,倒序遍历,只需改变next()方法即可,那么我们来创建一个倒序遍历的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类型,即可实现。
有什么问题,欢迎指正!