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)
        }

    }

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift中,泛型和协议是两个非常有用的特性,它们可以帮助我们编写更加灵活和可重用的代码。 ### 泛型 泛型是指在编写代码时,使用占位符来表示数据类型。这样我们可以编写可以处理任何类型数据的代码,而不用针对不同的数据类型编写不同的代码。 例如,我们可以编写一个函数来交换两个变量的值: ```swift func swap<T>(_ a: inout T, _ b: inout T) { let temp = a a = b b = temp } var x = 1 var y = 2 swap(&x, &y) print("x = \(x), y = \(y)") // 输出 x = 2, y = 1 ``` 在这个例子中,我们使用了一个名为`T`的占位符来表示数据类型。这个函数可以处理任何类型的变量,只要它们可以被互相交换。 ### 协议 协议是一种规范,用于描述类、结构体和枚举应该具有的属性和方法。协议可以被任意类型遵循,并且可以作为参数、返回值或泛型约束。 例如,我们可以定义一个协议来描述可以被排序的类型: ```swift protocol Sortable { associatedtype Element func sort() -> [Element] } extension Array: Sortable where Element: Comparable { func sort() -> [Element] { return self.sorted() } } ``` 在这个例子中,我们定义了一个名为`Sortable`的协议,它有一个关联类型`Element`和一个`sort`方法。我们还扩展了数组类型,使它可以遵循`Sortable`协议,并实现`sort`方法。 现在我们可以使用`Sortable`协议来对任何可以被排序的类型进行排序: ```swift func sort<T: Sortable>(_ value: T) -> [T.Element] { return value.sort() } let numbers = [3, 1, 4, 1, 5, 9, 2] let sortedNumbers = sort(numbers) print(sortedNumbers) // 输出 [1, 1, 2, 3, 4, 5, 9] ``` 在这个例子中,我们定义了一个泛型函数`sort`,它接受任何遵循`Sortable`协议的类型。我们可以将数组`numbers`传递给`sort`函数,因为它可以被排序,并且已经遵循了`Sortable`协议。 这里只是简单介绍了Swift中泛型和协议的使用,它们还有很多高级用法和细节。如果你想深入学习它们,可以查看Swift官方文档或其他相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值