دفتر الأستاذ المصرفي
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 57 من 57.
التحدي
صعبأنشئ بنكًا صغيرًا. Account هو صنف يحتوي على id وowner وprivate(set) var balance، وعلى الطريقتين deposit(_:) وwithdraw(_:) اللتين ترميان الخطأ BankError.invalidAmount (عندما تكون القيمة أقل من 1) والخطأ BankError.insufficient(id:). يسمح Checking بالسحب على المكشوف بمقدار 100 (يمكن أن ينخفض الرصيد إلى -100)؛ بينما يرفض Savings عمليات السحب التي تجعل الرصيد سالبًا، ويضيف فائدة بنسبة 1% (مع التقريب إلى أسفل) في monthEnd()، ويسمح بحد أقصى يبلغ عمليتي سحب شهريًا (BankError.limit(id:))، ويُعاد ضبط هذا العدد بواسطة monthEnd(). لا تفعل Account.monthEnd() شيئًا. يخزّن الصنف Bank الحسابات بحسب المعرّف، ويحتوي على transfer(from:to:amount:)، الذي يسحب ويودع، أو لا يُجري أي تغيير عند الفشل.
يقرأ الكود المزوَّد الأوامر open checking 1 ada أو open savings 2 bo أو dep 1 100 أو wd 2 30 أو tr 1 2 50 أو month، ويطبع ok أو الخطأ (invalid amount أو insufficient funds in 2 أو withdrawal limit on 2 أو no account 9)، ثم يطبع أخيرًا كل حساب مرتبًا بحسب المعرّف بالشكل 1 ada checking: -20.
ضع كودك في BankError.swift وAccount.swift وChecking.swift وSavings.swift وBank.swift. يحتوي main.swift على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let bank = Bank()
for cmd in input {
let p = cmd.split(separator: " ").map(String.init)
do {
switch p[0] {
case "open":
let id = Int(p[2])!
bank.accounts[id] = p[1] == "savings" ? Savings(id: id, owner: p[3]) : Checking(id: id, owner: p[3])
case "dep": try bank.account(Int(p[1])!).deposit(Int(p[2])!)
case "wd": try bank.account(Int(p[1])!).withdraw(Int(p[2])!)
case "tr": try bank.transfer(from: Int(p[1])!, to: Int(p[2])!, amount: Int(p[3])!)
default: bank.accounts.values.forEach { $0.monthEnd() }
}
print("ok")
} catch BankError.invalidAmount {
print("invalid amount")
} catch BankError.insufficient(let id) {
print("insufficient funds in \(id)")
} catch BankError.limit(let id) {
print("withdrawal limit on \(id)")
} catch BankError.noAccount(let id) {
print("no account \(id)")
} catch {
print("error")
}
}
for id in bank.accounts.keys.sorted() {
let a = bank.accounts[id]!
print("\(a.id) \(a.owner) \(a.kind): \(a.balance)")
}
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift