סיכום – מערכת תשלומים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 כאשר אף אחד מהם לא מצליח. היא גם מחזירה את אמצעי התשלום המעודכנים, כך שהיתרות שלהם יישמרו בין רכישות.
הקוד שסופק קורא יתרת ארנק ויתרת כרטיס מתנה, ואז את סכומי הרכישות. עבור כל רכישה הוא מנסה את כרטיס המתנה, הארנק והכרטיס, לפי הסדר הזה, ומדפיס את התוצאה ולאחר מכן את היתרות הסופיות.
הקוד שלכם יופיע בקבצים PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift ו-Functions.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
// קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
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)") }
}
כל השיעורים ביחידה תכנות מונחה עצמים
7פולימורפיזם וטיפוסים גנריים
פולימורפיזםהמרת טיפוסיםפונקציות גנריותטיפוסים גנרייםסיכום - מחשבון צורות6פרוטוקולים
הגדרת פרוטוקוליםטיפוסים התואמים לפרוטוקולהרחבות לפרוטוקוליםפרוטוקולים כטיפוסיםסיכום – מערכת תשלומיםתרגלו בעצמכם: Swift אונליין