CustomStringConvertible
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 37 z 57.
Gdy wypisujesz wartość, Swift domyślnie pokazuje jej typ i właściwości, a w przypadku klasy tylko nazwę typu. Zgodność z protokołem CustomStringConvertible i podanie właściwości description pozwalają kontrolować wyświetlany tekst:
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))Wynik:
Money(cents: 1250)
$12.50description jest używane przez print, interpolację ciągów znaków i String(describing:), więc jedna właściwość kontroluje każde miejsce, w którym wyświetlana jest wartość:
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)Wynik:
start at (2, 5)
[(2, 5), (0, 0)]
6Najwięcej zyskują na tym klasy, ponieważ w przeciwnym razie wydrukowanie instancji klasy pokazuje tylko jej nazwę typu:
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))Wynik:
main.Account
Ada: 5Zadbaj, aby description było krótkie i czytelne dla ludzi. Nie służy do parsowania i nie powinno zmieniać wartości:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Wyzwanie
ŁatwySpraw, aby struktura Fraction (licznik, mianownik) była zgodna z CustomStringConvertible. Jej description wyświetla ułamek w najprostszej postaci: 6/8 jest wyświetlane jako 3/4, 4/2 jako 2, 0/5 jako 0, a w ujemnym ułamku znak pozostaje z przodu (-1/2). Napisz funkcję pomocniczą gcd(_:_:) do skracania ułamków.
Dostarczony kod odczytuje ułamki a/b, po jednym w wierszu, i wyświetla każdy z nich za pomocą print.
Twój kod umieść w plikach Fraction.swift i Functions.swift. Plik main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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]))
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Swift