Sequence in Swift

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类型,即可实现。

有什么问题,欢迎指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容