美文网首页
[Swift]自定义队列Queue索引超界

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

作者: 无衔 | 来源:发表于2019-01-18 21:21 被阅读8次

    本身这个问题并不难,主要是支持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")
        }
    

    相关文章

      网友评论

          本文标题:[Swift]自定义队列Queue索引超界

          本文链接:https://www.haomeiwen.com/subject/pbeodqtx.html