Книги и читатели
Часть раздела Объектно-ориентированное программирование путешествия по 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)Вывод:
falsehandle(_:) разделяет команду и выполняет переключение по её первому слову. Каждая ветвь возвращает свои ответы в виде массива, поэтому такая команда, как 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Задание
ЛегкоРеализуйте 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) }
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift