Menu
Coddy logo textTech

Книги и читатели

Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 50 из 57.

В этом проекте ты создашь основу библиотечной системы. Класс Library получает команды, по одной в каждой строке, и отвечает на каждую из них. За пять шагов он научится добавлять книги и читателей, выдавать и принимать книги обратно, искать в каталоге и печатать отчёт.

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, может ответить несколькими строками. Название книги может содержать пробелы, поэтому оно включает всё после идентификатора:

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

Задание

Легко

Реализуйте Library.handle(_:) для первых двух команд:

  • ADD_BOOK <id> <title>: сохраните новую доступную книгу и верните ответ added book 1: Dune; если идентификатор уже занят, верните ответ book 1 exists.
  • JOIN <name>: добавьте участника и верните ответ welcome ada; если имя уже существует, верните ответ ada is already a member.

Предоставленный код передаёт каждую входную строку в library.handle(_:) и выводит каждый возвращённый ответ в отдельной строке. Имена участников состоят из одного слова в нижнем регистре, идентификаторы книг являются целыми числами, а входные данные содержат только описанные на данный момент команды. Для любой другой команды возвращается ответ 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