Swiftで書く「Java言語で学ぶデザインパターン入門 第3版」第1章 Iterator for例追加

Java言語で学ぶデザインパターン入門 第3版

サンプルプログラムをSwiftで書く。

第1章 Iterator

Bookクラス

import Foundation

public class Book {
    private var name: String
    
    public init(name: String) {
        self.name = name
    }
    
    public func getName() -> String {
        return self.name
    }
}

BookShelfクラス

import Foundation

public class BookShelf: Sequence {
    private var books: [Book] = []

    public func getBookAt(index: Int) -> Book {
        return self.books[index]
    }

    public func appendBook(book: Book) {
        self.books.append(book)
    }
    
    public func getLength() -> Int {
        self.books.count
    }
    
    public func makeIterator() -> some IteratorProtocol {
        return BookShelfIterator(self)
    }
}

BookShelfIteratorクラス

import Foundation

public class BookShelfIterator: IteratorProtocol {
    public typealias Element = Book
    
    var index: Int
    
    private let bookShelf: BookShelf
    
    public init(_ bookShelf: BookShelf) {
        self.bookShelf = bookShelf
        self.index = 0
    }
        
    public func next() -> Element? {
        guard index < self.bookShelf.getLength() else {
            return nil
        }
        let book = self.bookShelf.getBookAt(index: index)
        index = index + 1
        return book
    }
}

Mainクラス

import Foundation

public class DP01Iterator {
    public static func main() {
        let bookShelf: BookShelf = BookShelf()
        bookShelf.appendBook(book: Book(name: "Around the world in 80 Days"))
        bookShelf.appendBook(book: Book(name: "Bible"))
        bookShelf.appendBook(book: Book(name: "Cinderella"))
        bookShelf.appendBook(book: Book(name: "Daddy-Long-Legs"))

        print("--- while ---")
        var it = bookShelf.makeIterator()
        while let book = it.next() as? Book {
            print(book.getName())
        }
        
        print("--- for ---")
        for book in bookShelf {
            print((book as! Book).getName())
        }
    }
}

main.swift

import Foundation

DP01Iterator.main()

Swift

Posted by shi-n