[Swift]自定义队列Queue索引超界

本身这个问题并不难,主要是支持enqueue和dequeue方法。网上有很多例子,这里不赘述。
为了支持for in 循环,一般还会实现Sequence协议。

网上个别例子可能在swift 4就会有错误。
因为同时实现了Collection之类的协议,导致隐藏了对Sequence实现的问题。

当for in 的集合元素为0个时会发生索引超界异常。

是makeIterator,不是generate

如果是在一个纯净的环境实现了Sequence ,写成generate马上就编译报错了,但是如果同时跟Collection之类的协议有关系,因为Collection继承自Sequence,会导致问题被隐藏起来了。

 //扩展队列的for...in循环功能
extension Cat008_Queue: Sequence {

    // 从序列中返回一个迭代器
    //public func generate() -> AnyIterator<T> { //这个方法无效并不存在于 Sequence
    public func makeIterator() -> AnyIterator<T>  {
        return AnyIterator(IndexingIterator(_elements: data.lazy))
    }
}

队列实现的简单基本功能代码


// 定义一个队列结构
public struct Cat008_Queue<T> {

    // 数组用来存储数据元素
    private var data = [T]()
    
    // 构造方法,用于构建一个空的队列
    public init() {}
    
    
    // 将类型为T的数据元素添加到队列的末尾
    public mutating func enqueue(element: T) {
        data.append(element)
    }
    
    // 移除并返回队列中第一个元素
    // 如果队列不为空,则返回队列中第一个类型为T的元素;否则,返回nil。
    public mutating func dequeue() -> T? {
        return data.removeFirst()
    }
    
    // 清空队列中的数据元素
    public mutating func clear() {
        data.removeAll()
    }
}

 //扩展队列的for...in循环功能
extension Cat008_Queue: Sequence {

    // 从序列中返回一个迭代器
    //public func generate() -> AnyIterator<T> { //这个方法无效并不存在于 Sequence
    public func makeIterator() -> AnyIterator<T>  {
        return AnyIterator(IndexingIterator(_elements: data.lazy))
    }
}

测试方法

func runTest() {
        
        var k = Cat008_Queue<Int>()
        k.enqueue(element: 2)
        k.enqueue(element: 5)
        for item in k {
            print(item)
        }
        
        //在受到extension了其他collcetion类干扰的情况下,
        //对Sequence的扩展中写的方法名是generate(),则在
        //for循环的集合元素个数=0时会崩溃,下标超界
        var mm = Cat008_Queue<Int>()
        for item in mm {
            print(item)
        }
        
        print("end \(type(of:self)) test")
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 集合(Collection)是建立在序列(sequence)上层的类型,它添加了可重复遍历元素和根据下标访问...
    iOS开发攻城狮阅读 4,251评论 0 0
  • 一、Designing Your Data Source and Delegate Every collectio...
    零点知晨阅读 3,114评论 0 0
  • 队列(Queue)是一种先入先出(First in First Out,简称FIFO)的数据结构。想象一下,在排队...
    落叶刺客阅读 9,062评论 1 3
  • 人类的身体 最早是马匹 然后演变成火车 现在进化成了飞机 马匹时代 灵魂驾驭着白驹 万马奔腾,点燃远方的山脉 睡眠...
    Love_999阅读 1,293评论 0 1
  • 18.4.26晚我流下了伤心的泪水,掺杂着太多情绪,我想说离婚吧
    鸿雁南归阅读 1,703评论 0 0