CustomStringConvertible
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 37 von 57.
Wenn du einen Wert ausgibst, zeigt Swift standardmäßig seinen Typ und seine Eigenschaften an, bei einer Klasse jedoch nur den Typnamen. Durch die Konformität mit CustomStringConvertible und die Bereitstellung von description steuerst du den Text:
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))Ausgabe:
Money(cents: 1250)
$12.50description wird von print, der String-Interpolation und String(describing:) verwendet, sodass eine Eigenschaft jede Stelle steuert, an der der Wert angezeigt wird:
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)Ausgabe:
start at (2, 5)
[(2, 5), (0, 0)]
6Klassen profitieren am meisten, da das Ausgeben einer Klasseninstanz andernfalls nur ihren Typnamen anzeigt:
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))Ausgabe:
main.Account
Ada: 5Halte description für Menschen kurz und gut lesbar. Es ist nicht zum Parsen gedacht und sollte den Wert nicht verändern:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Aufgabe
EinfachBringe die Struktur Fraction (Zähler, Nenner) dazu, CustomStringConvertible zu entsprechen. Ihre description zeigt den Bruch in vollständig gekürzter Form: 6/8 wird als 3/4 ausgegeben, 4/2 als 2, 0/5 als 0, und ein negativer Bruch behält das Vorzeichen vorne (-1/2). Schreibe eine Hilfsfunktion gcd(_:_:) für das Kürzen.
Der bereitgestellte Code liest Brüche a/b, einen pro Zeile, und gibt jeden mit print aus.
Dein Code gehört in Fraction.swift und Functions.swift. main.swift enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
// Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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]))
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Swift-Playground