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 impara ad aggiungere libri e membri, prestare e riprendere libri, cercare nel catalogo e stampare un resoconto.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTIl modello dei dati utilizza gli strumenti di questa sezione. Book è una struttura: 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 mantiene entrambi in dizionari privati, così 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:
falsehandle(_:) divide il comando e usa la sua prima parola per decidere quale ramo eseguire. 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 comprende 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 HobbitSfida
FacileCompleta Library.handle(_:) per i primi due comandi:
ADD_BOOK <id> <title>: memorizza un nuovo libro disponibile e rispondiadded book 1: Dune; se l'id è già utilizzato, rispondibook 1 exists.JOIN <name>: aggiungi un membro e rispondiwelcome ada; se il nome esiste già, rispondiada is already a member.
Il codice fornito passa ogni riga di input a library.handle(_:) e stampa ogni risposta restituita su una riga distinta. I nomi dei membri sono parole singole in minuscolo, 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 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) }
}
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
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift