Menu
Coddy logo textTech

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.50

description 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)]
6

Klassen 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: 5

Halte 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"
        }
    }
}
challenge icon

Aufgabe

Einfach

Bringe 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]))
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground