Menu
Coddy logo textTech

本と会員

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 50/57。

このプロジェクトでは、図書館システムの中核を構築します。Libraryクラスは1行につき1つのコマンドを受け取り、それぞれに応答します。5つのステップを通して、本とメンバーの追加、本の貸し出しと返却、蔵書の検索、レポートの出力を学びます。

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

データモデルでは、このセクションのツールを使用します。Book は構造体です。その値である borrower が変化します。Member はクラスです。これは、図書館とメンバーの貸出リストが同じ人物を参照するためです。図書館は両方を非公開の辞書に保持するため、それらを変更できるのはそのメソッドだけです:

struct Book {
    let id: Int
    let title: String
    var borrower: String? = nil
    var isAvailable: Bool { borrower == nil }
}

var books: [Int: Book] = [:]
books[1] = Book(id: 1, title: "Dune")
books[1]!.borrower = "ada"
print(books[1]!.isAvailable)

出力:

false

handle(_:)はコマンドを分割し、最初の単語に基づいて分岐します。各分岐は返信を配列として返すため、REPORTのようなコマンドは複数行を返すことができます。本のタイトルにはスペースを含められるため、id以降のすべてがタイトルになります。

let p = "ADD_BOOK 7 The Hobbit".split(separator: " ").map(String.init)
let id = Int(p[1])!
let title = p.dropFirst(2).joined(separator: " ")
print("\(id): \(title)")

出力:

7: The Hobbit
challenge icon

チャレンジ

簡単

最初の2つのコマンドについて、Library.handle(_:)を完成させてください:

  • ADD_BOOK <id> <title>:新しい利用可能な本を保存し、added book 1: Duneと応答します。idがすでに使われている場合は、book 1 existsと応答します。
  • JOIN <name>:メンバーを追加し、welcome adaと応答します。名前がすでに存在する場合は、ada is already a memberと応答します。

提供されたコードは、すべての入力行をlibrary.handle(_:)に渡し、返された各応答をそれぞれ別の行に出力します。メンバー名は小文字1語で、書籍のidは整数です。また、入力にはここまでで説明したコマンドだけが含まれます。それ以外のコマンドにはunknown commandと応答します。

コードはBook.swift、Member.swift、Library.swiftに記述してください。main.swiftには提供された入出力コードが含まれており、編集できません。

自分で試してみよう

// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
let library = Library()
for line in input {
    for reply in library.handle(line) { print(reply) }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド