本と会員
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)出力:
falsehandle(_:)はコマンドを分割し、最初の単語に応じて処理を切り替えます。各分岐は返信を配列として返すため、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チャレンジ
簡単最初の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) }
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド