CustomStringConvertible
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 37 / 57.
Bir değeri yazdırdığınızda Swift, varsayılan olarak türünü ve özelliklerini gösterir; sınıflar için ise yalnızca tür adını gösterir. CustomStringConvertible protokolüne uyup description sağlayarak metni kontrol edebilirsiniz:
struct Money {
let cents: Int
}
struct Price: CustomStringConvertible {
let cents: Int
var description: String { "$\(cents / 100).\(cents % 100)" }
}
print(Money(cents: 1250))
print(Price(cents: 1250))Çıktı:
Money(cents: 1250)
$12.50description, print tarafından, dize enterpolasyonu tarafından ve String(describing:) tarafından kullanılır; böylece tek bir özellik, değerin gösterildiği her yeri kontrol eder:
struct Point: CustomStringConvertible {
let x: Int, y: Int
var description: String { "(\(x), \(y))" }
}
let p = Point(x: 2, y: 5)
print("start at \(p)")
print([p, Point(x: 0, y: 0)])
print(String(describing: p).count)Çıktı:
start at (2, 5)
[(2, 5), (0, 0)]
6Sınıflar en çok faydayı sağlar, çünkü bir sınıf örneğini yazdırmak aksi takdirde yalnızca tür adını gösterir:
class Account {
let owner: String
var balance: Int
init(owner: String, balance: Int) { self.owner = owner; self.balance = balance }
}
class NamedAccount: CustomStringConvertible {
let owner: String
var balance: Int
init(owner: String, balance: Int) { self.owner = owner; self.balance = balance }
var description: String { "\(owner): \(balance)" }
}
print(Account(owner: "Ada", balance: 5))
print(NamedAccount(owner: "Ada", balance: 5))Çıktı:
main.Account
Ada: 5description değerini insanlar için kısa ve okunabilir tutun. Ayrıştırma için tasarlanmamıştır ve değeri değiştirmemelidir:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Görev
KolayFraction struct'ını (pay, payda) CustomStringConvertible protokolüne uygun hâle getirin. description, kesri en sade biçiminde gösterir: 6/8, 3/4 olarak; 4/2, 2 olarak; 0/5, 0 olarak yazdırılır ve negatif bir kesir işareti başında tutar (-1/2). Sadeleştirme için bir gcd(_:_:) yardımcı işlevi yazın.
Sağlanan kod, her satırda bir tane olacak şekilde a/b biçimindeki kesirleri okur ve her birini print ile yazdırır.
Kodunuz Fraction.swift ve Functions.swift dosyalarına yazılmalıdır. main.swift, sağlanan girdi/çıktı 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) }
for line in input {
let p = line.split(separator: "/").map { Int($0)! }
print(Fraction(numerator: p[0], denominator: p[1]))
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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