美文网首页iOS Developer
Swift设计模式——迭代器模式

Swift设计模式——迭代器模式

作者: 晓晓魔导师 | 来源:发表于2017-06-01 06:51 被阅读0次

什么是迭代器模式?

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。

使用场景:

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口。

示例:

//定义一个小说结构
struct Novella {
    let name: String //小说名
}

//定义一个小说集合结构
struct Novellas {
    let novellas: [Novella] //存放的一些小说
}

//定义一个小说迭代器(遵循Swift的迭代器协议)
struct NovellasIterator: IteratorProtocol {
    
    private var current = 0 //当前索引
    private let novellas: [Novella] //小说堆
    
    init(novellas: [Novella]) {
        self.novellas = novellas
    }
    
    //实现协议方法
    mutating func next() -> Novella? {
        defer {
            current += 1 //当方法结束后当前索引值+1
        }
        //如果小说集合内的小说数量大于当前索引,则返回当前索引值里的小说,返回nil
        return novellas.count > current ? novellas[current] : nil
    }
}

//将小说集合遵循Swift序列协议
extension Novellas: Sequence {
    //实现协议方法(制作一个小说迭代器)
    func makeIterator() -> NovellasIterator {
        return NovellasIterator(novellas: novellas)
    }
}

使用方式

//MAKE: - Usage
//创建小说迭代器并添加些小说
let greatNovellas = Novellas(novellas: [Novella(name: "The Mist"), Novella(name: "The Mist2")])

//遍历取出小说阅读
for novella in greatNovellas {
    print("I 've read: \(novella)")
}

优点

  1. 它支持以不同的方式遍历一个聚合对象。
  2. 迭代器简化了聚合类。
  3. 在同一个聚合上可以有多个遍历。
  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点

  1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

总结

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

相关文章

网友评论

    本文标题:Swift设计模式——迭代器模式

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