iOS设计模式之迭代器模式

作者: 3697d6c42285 | 来源:发表于2017-05-16 16:30 被阅读35次

    迭代器模式

    1、什么是迭代器模式

    提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

    迭代器是 iOS 中运用的最多的模式之一,你用到的NSArray``NSDictionary``NSSet等都是迭代器模式的实现,是 iOS 已经完整实现了的。如果你有详细的翻一下它们存在的属性的话,应该会注意到有一个属性叫objectEnumeratorreverseObjectEnumerator它们就是具体的迭代器,通过next顺序访问。

    2、迭代器模式用在什么地方

    • 需要访问组合对象的内容又不暴露内部表示
    • 通过多种方式遍历组合数组
    • 通过一个统一接口,遍历各种类型的组合对象

    说实话,需要用到迭代器的地方太多了,基本上有重复类型的对象都可以考虑使用迭代器模式,将所有对象封装到一起,方便读写与访问。

    3、迭代器模式的使用

    1、如果你会使用数组和字典,那么你就会使用迭代器

    总结

    属于系统就已经帮你实现好的模式,你只需要调用即可,想要更深入理解,建议去看看数据结构:队列、栈等容易加深理解

    demo

    /// 堆栈迭代器
    class StackIterator: NSObject {
        private lazy var stack = NSMutableArray()
        func push(object :Any) {
            stack.add(object)
        }
        
        func pop() -> Any {
            let object = readStackRear
            if empty() {
                stack.remove(object)
            }
            return object
        }
    
        /// 读取栈尾
        func readStackRear()  -> Any {
            if empty() {
                return NSNull()
            }
            let object = stack.lastObject
            return object!
        }
        
        func count() -> Int {
            return stack.count
        }
        
        func empty() -> Bool {
            return stack.count == 0
        }
    }
    
    /// 队列迭代器
    class QueueIterator: NSObject {
        private lazy var quene = NSMutableArray()
        func inQuene(object :Any) {
            quene.add(object)
        }
        
        func outQuene() -> Any {
            let object = readQueneHead()
            if empty() == false {
                quene.remove(object)
            }
            return object
        }
        
        /// 读取队首
        func readQueneHead()  -> Any {
            if empty() {
                return NSNull()
            }
            let object = quene.firstObject
            return object!
        }
        
        func count() -> Int {
            return quene.count
        }
        
        func empty() -> Bool {
            return quene.count == 0
        }
    }
    
    /// 迭代器
    class EnumIterator: NSObject {
        private(set) lazy var allObjects = NSArray()
        private lazy var index = 0
        
        init(allObjects : NSArray) {
            super.init()
            self.allObjects = allObjects
        }
        
        func nextObject() -> Any {
            if index >= allObjects.count {
                return NSNull()
            }
            let object = allObjects[index]
            index += 1
            return object
        }
        
    }
    

    相关文章

      网友评论

      • 471b0707ab73:楼主只是简单的说了下,有做相应的编码吗
        3697d6c42285:我用 NSArray 简单写了栈和队列等迭代器,其他语言的也是类似

      本文标题:iOS设计模式之迭代器模式

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