Menu
CoddyTech

ספרים וחברים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין