Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الكتب والأعضاء

جزء من قسم البرمجة كائنية التوجه في رحلة 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