Menu
CoddyTech

本と会員

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プレイグラウンド