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

مراجعة - نظام الدفع

جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 31 من 57.

challenge icon

التحدي

صعب

صمّم نظام دفع باستخدام البروتوكولات. يتطلب 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)") }
}

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

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