Menu
Coddy logo textTech

ספרים וחברים

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

פלט:

false

handle(_:) מפצלת את הפקודה ומבצעת 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
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 אונליין