首先我们先看下在苹果的官方的文档中给我们的介绍其的一些方法
首先是关于AnyIterator的初始化方法,官方解释就是创建一个迭代器,该迭代器在其next()方法中包装给定的闭包,所以我们下面的例子初始化AnyIterator其实就是包装为了next方法
init(_body: @escaping () -> AnyIterator.Element?)
然后我们再来看下例子
var x = 7
let iterator: AnyIterator<Int> = AnyIterator {
defer { x += 1 }
return x < 15 ? x : nil
}
let a = Array(iterator)
// a == [7, 8, 9, 10, 11, 12, 13, 14]
由此我们可以知道以给迭代器返回我们要返回的元素直到nil为止
再看下我们的AnySequence初始化方法,也就是上面调用的初始化方法
init<I>(_makeUnderlyingIterator: @escaping () -> I) where Element == I.Element, I : IteratorProtocol
方法一:紧接着我们再去定义一个迭代器既遵守IteratorProtocol协议又遵守Sequence协议
struct MyIterator<Element>:IteratorProtocol, Sequence {
//闭包
var base:()->Element?
init(_ body: @escaping () -> Element?)
{
//保存了闭包
base = body
}
//写的next方法
func next() -> Element?
{
return base()
}
}
在外界我们可以自己去创建一个迭代器,调用一次next方法就相当于是迭代器当中保存的那个闭包去调用了一次,以及我们的for-in循环,for-in 只要是遵循了Sequence协议的对象,就可以利用for-in循环进行迭代了。其本质是调用了 next() 方法
var x = 7
let iterator:MyIterator<Int> = MyIterator {
defer { x += 1 }
return x < 15 ? x : nil
}
print("\(iterator.next())")
print("\(iterator.next())")
for a in iterator {
print(a)
}
输出内容如下所示
方法二:我们也可以通过下面的将iterator包装到数组当中,然后去遍历输出也是可以的
for a in Array(iterator)
{
print(a)
}
方法三:迭代器的另外一种实现方法,MyIterator结构体遵守Sequence协议,实现 makeIterator()方法
struct MyIterator<Element>:Sequence
{
public func makeIterator() -> AnyIterator<Int> {
var idx = 0
return AnyIterator {
if idx >= 5 {
return Optional<Int>.none
} else {
//否则返回的是对应的值
idx += 1
return idx
}
}
}
}
在外部我们可以直接将我们定义的遵守了Sequence协议的容器,给放入Array当中,然后调用for -in 循环就可以遍历了
let iterator = MyIterator<Int>()
for a in Array(iterator)
{
print(a)
}
for a in Array(iterator)
{
print(a)
}
}
方法四:我们使用下面的方式也是可以进行输出的,一直输出到nil为止
var idx = 1;
var base:()->Int? = {
defer {
idx += 1
}
return idx < 5 ? idx : nil
}
let sequenc = AnySequence{
AnyIterator {
base()
}
}
for a in sequenc {
print(a)
}
}