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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Swift