CustomStringConvertible
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 37 dari 57.
Saat kamu mencetak nilai, secara default Swift menampilkan tipe dan property-nya, sedangkan untuk class hanya nama tipenya. Dengan mengadopsi CustomStringConvertible dan menyediakan description, kamu dapat mengontrol teksnya:
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))Output:
Money(cents: 1250)
$12.50description digunakan oleh print, interpolasi string, dan String(describing:), jadi satu property mengatur setiap tempat nilai ditampilkan:
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)Output:
start at (2, 5)
[(2, 5), (0, 0)]
6Class paling diuntungkan, karena mencetak instance class biasanya hanya menampilkan nama tipe datanya:
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))Output:
main.Account
Ada: 5Buat description tetap singkat dan mudah dibaca orang. Teks ini tidak dimaksudkan untuk diparsing, dan seharusnya tidak mengubah nilainya:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Tantangan
MudahBuat struct Fraction (pembilang, penyebut) agar sesuai dengan CustomStringConvertible. description-nya menampilkan pecahan dalam bentuk paling sederhana: 6/8 dicetak sebagai 3/4, 4/2 sebagai 2, 0/5 sebagai 0, dan tanda pecahan negatif tetap berada di depan (-1/2). Tulis fungsi pembantu gcd(_:_:) untuk menyederhanakannya.
Kode yang disediakan membaca pecahan a/b, satu per baris, lalu mencetak masing-masing dengan print.
Kodemu ditulis di Fraction.swift dan Functions.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan apa adanya
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]))
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift