ספרים וחברים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 50 מתוך 57.
בפרויקט הזה תבנו את הליבה של מערכת ספרייה. המחלקה Library מקבלת פקודות, אחת בכל שורה, ומשיבה לכל אחת מהן. בחמישה שלבים היא לומדת להוסיף ספרים וחברים, להשאיל ולהחזיר ספרים, לחפש בקטלוג ולהפיק דוח.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTמודל הנתונים משתמש בכלים של יחידה זו. Book הוא struct: ערך שה־borrower שלו משתנה. Member הוא class, כי הספרייה ורשימת ההשאלות של חבר מפנות לאותו אדם. הספרייה שומרת את שניהם במילונים פרטיים, כך שרק המתודות שלה יכולות לשנות אותם:
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(_:) מפצלת את הפקודה ומבצעת switch על המילה הראשונה שלה. כל ענף מחזיר את התשובות שלו כמערך, כך שפקודה כמו 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) }
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
תרגלו בעצמכם: Swift אונליין