iOS设计模式之迭代器模式

141 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第十七篇,迭代器模式的相关回顾。

迭代器模式

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