مراجعة - نظام الدفع
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 31 من 57.
التحدي
صعبصمّم نظام دفع باستخدام البروتوكولات. يتطلب PaymentMethod كلًا من name وfee(for amount: Int) -> Int وmutating func pay(_ amount: Int) -> Bool. يوفّر امتداد البروتوكول total(for:) (المبلغ بالإضافة إلى الرسوم). نفّذ Card (رسوم بنسبة 2% مع التقريب إلى الأسفل، وينجح دائمًا، ويعدّ payments)، وWallet (يحتوي على balance مخزّن، ومن دون رسوم، ويفشل عندما يكون الإجمالي أكبر من الرصيد، وإلا فإنه يقلّله) وGiftCard (يحتوي على balance مخزّن، ومن دون رسوم، ويدفع أي مبلغ يستطيع دفعه: وعندما يكون الرصيد غير كافٍ فإنه يرفض العملية). أكمل checkout(_:with:)، الذي يجرّب كل طريقة دفع بالترتيب المحدد ويُرجع paid 100 with wallet (fee 0) لأول طريقة تنجح، أو declined عندما لا تنجح أيٌّ منها. كما يُرجع الطرق المحدّثة حتى تستمر أرصدتها بين عمليات الشراء.
يقرأ الكود الم provided رصيد المحفظة ورصيد بطاقة الهدايا، ثم مبالغ الشراء. ولكل عملية شراء، يجرّب بطاقة الهدايا ثم المحفظة ثم البطاقة بهذا الترتيب، ويطبع النتيجة، ثم الأرصدة النهائية.
ضع كودك في PaymentMethod.swift وCard.swift وWallet.swift وGiftCard.swift وFunctions.swift. يحتوي main.swift على كود الإدخال/الإخراج الم provided ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
var methods: [any PaymentMethod] = [GiftCard(balance: Int(input[1])!), Wallet(balance: Int(input[0])!), Card()]
for line in input.dropFirst(2) {
let (result, updated) = checkout(Int(line)!, with: methods)
methods = updated
print(result)
}
for m in methods {
if let g = m as? GiftCard { print("gift card left \(g.balance)") }
if let w = m as? Wallet { print("wallet left \(w.balance)") }
if let c = m as? Card { print("card payments \(c.payments)") }
}
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكال3الخصائص بتعمّق
الخصائص المحسوبةمراقبو الخصائصالأعضاء الثابتةالتعدادات مع الدوالمراجعة - سجل درجات الحرارة6البروتوكولات
تعريف البروتوكولاتالأنواع المتوافقةامتدادات البروتوكولاتالبروتوكولات كأنواعمراجعة - نظام الدفعتدرّب بنفسك: Playground لـ Swift