Banka Defteri
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 57 / 57.
Görev
ZorKüçük bir banka oluşturun. Account, id, owner ve bir private(set) var balance içeren bir sınıftır; ayrıca 1'in altındaki değerlerde BankError.invalidAmount ve BankError.insufficient(id:) hatalarını fırlatan deposit(_:) ve withdraw(_:) yöntemlerine sahiptir. Checking 100 tutarında kredili mevduata izin verir (bakiye -100'e kadar düşebilir); Savings, bakiyeyi negatife düşürecek para çekme işlemlerini reddeder, monthEnd() içinde %1 faiz ekler (aşağı yuvarlanır) ve ayda en fazla 2 para çekme işlemine izin verir (BankError.limit(id:)); bu sınır monthEnd() ile sıfırlanır. Account.monthEnd() hiçbir şey yapmaz. Bank sınıfı hesapları id'ye göre saklar ve para çekip yatıran transfer(from:to:amount:) yöntemine sahiptir; başarısızlık durumunda hiçbir işlemi geri almaz.
Sağlanan kod open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 veya month komutlarını okur; ok ya da hatayı (invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9) yazdırır ve son olarak her hesabı id'ye göre sıralanmış şekilde 1 ada checking: -20 biçiminde yazdırır.
Kodunuz BankError.swift, Account.swift, Checking.swift, Savings.swift ve Bank.swift dosyalarına yerleştirilmelidir. main.swift, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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)")
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground