Swiftでデザインパターン イテレーターパターン


こちらを参考に、Swiftで簡単に書き直し
https://qiita.com/sugihara-masaki/items/0d3982276eb7494dc25d

イテレーターパターン

  • コンテナの内部表現を隠蔽して要素へのアクセスを提供するパターン
  • 「リリース日が最近の順」など順番の項目ごとにIteraterクラスを作成し、そこで実装することで、関心を分離する

struct Movie {
    var title: String
    var publishedYear: Int = 0
}

struct MovieAggregate {
    var movies: [Movie] = [Movie]()

    mutating func addMovie(movie: Movie) {
        self.movies.append(movie)
    }

    func getByIndex(index: Int) -> Movie {
        return self.movies[index]
    }

    func size() -> Int {
        return self.movies.count
    }
}

struct RecentIterator {
    var sortedMovies: [Movie] = [Movie]()
    var index: Int = 0

    init(aggregate: MovieAggregate) {
        self.sortedMovies = aggregate.movies.sorted(by: {
            $0.publishedYear > $1.publishedYear
        })
        self.index = 0
    }

    func hasNext() -> Bool {
        return self.index < self.sortedMovies.count
    }

    mutating func nextItem() -> Movie {
        let item = self.sortedMovies[index]
        self.index = index + 1
        return item
    }
}

var movieAggregate = MovieAggregate()

let shawshank = Movie(title: "ショーシャンクの空に", publishedYear: 1994)
movieAggregate.addMovie(movie: shawshank)

let matrix = Movie(title: "マトリックス", publishedYear: 1999)
movieAggregate.addMovie(movie: matrix)

let outrage = Movie(title: "アウトレイジ", publishedYear: 2010)
movieAggregate.addMovie(movie: outrage)

var iterator = RecentIterator(aggregate: movieAggregate)

while iterator.hasNext() {
    let movie = iterator.nextItem()
    print(movie.title)
}