Swift当中的AnyIterator和AnySequence的使用

首先我们先看下在苹果的官方的文档中给我们的介绍其的一些方法

首先是关于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)
        }

    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值