Menu
CoddyTech

Libri e utenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 50 di 57.

In questo progetto costruisci il nucleo di un sistema bibliotecario. Una classe Library riceve comandi, uno per riga, e risponde a ciascuno. In cinque passaggi imparerai ad aggiungere libri e membri, prestare e riprendere libri, cercare nel catalogo e stampare un rapporto.

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

Il modello dei dati usa gli strumenti di questa sezione. Book è una struct: un valore il cui borrower cambia. Member è una classe, perché la biblioteca e l’elenco dei prestiti di un membro fanno riferimento alla stessa persona. La biblioteca conserva entrambi in dizionari privati, quindi solo i suoi metodi possono modificarli:

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)

Output:

false

handle(_:) divide il comando e seleziona in base alla sua prima parola. Ogni ramo restituisce le proprie risposte come array, quindi un comando come REPORT può rispondere con più righe. Il titolo di un libro può contenere spazi, quindi corrisponde a tutto ciò che segue l'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)")

Output:

7: The Hobbit
challenge icon

Sfida

Facile

Completa Library.handle(_:) per i primi due comandi:

  • ADD_BOOK <id> <title>: memorizza un nuovo libro disponibile e rispondi added book 1: Dune; se l’id è già occupato, rispondi book 1 exists.
  • JOIN <name>: aggiungi un membro e rispondi welcome ada; se il nome esiste già, rispondi ada is already a member.

Il codice fornito passa ogni riga di input a library.handle(_:) e stampa ogni risposta restituita su una riga separata. I nomi dei membri sono parole minuscole singole, gli ID dei libri sono numeri interi e l’input contiene solo i comandi descritti finora. Qualsiasi altro comando restituisce unknown command.

Il tuo codice va inserito in Book.swift, Member.swift e Library.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

// Codice di input/output fornito: lascialo così com'è
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Swift