しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで学ぶデザインパターン6 (Iterator パターン)

今回はIteratorパターンについて書いていきます。

デザインパターンとは

デザインパターンとはソフトウェア開発の設計方法の事です。
オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。

Iterator パターンとは

Iterator パターンは繰り返しに関するパターンです。
リストを表す全てのデータにhasNextnextメソッドを付ける事で全てのデータを同じように扱う事ができます。

SwiftでのIterator パターンの実装方法

SwiftでのIterator パターンは下のように記述します。
Iteratorプロトコルに準拠したリストクラスを定義し、whileでリストのデータを順番に表示しています。

protocol Iterator {
    func hasNext() -> Bool
    func next() -> NSObject
}

class List: Iterator {
    var index = 0
    let data: [String] = ["データ1", "データ2", "データ3"]
    
    func hasNext() -> Bool {
        return index < data.count
    }
    
    func next() -> NSObject {
        return data[index++]
    }
}

let list = List()
while list.hasNext() {
    print(list.next())
}

上だけならfor inでも実現する事ができます。
Iteratorパターンが活きてくるのは下のように特殊なリストです。
下ではnext()でデータが無作為に取得できます。
これもIteratorプロトコルに準拠しているため上のListと同じように扱う事ができます。

class RandomList: Iterator {
    var index = 0
    var data: [String] = ["データ1", "データ2", "データ3"]
    
    func hasNext() -> Bool {
        return 1 <= data.count
    }
    
    func next() -> NSObject {
        let index = Int(arc4random()) % data.count
        let datum = data[index]
        data.removeAtIndex(index)
        return datum
    }
}

let list = List()
while list.hasNext() {
    print(list.next())
}

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン