CustomStringConvertible
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 37 di 57.
Quando stampi un valore, Swift mostra per impostazione predefinita il suo tipo e le sue proprietà, mentre per una classe mostra solo il nome del tipo. Conformarti a CustomStringConvertible e fornire description permette di controllare il testo:
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 viene usato da print, dall’interpolazione delle stringhe e da String(describing:), quindi una sola proprietà controlla ogni punto in cui viene mostrato il valore:
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)]
6Le classi ne traggono il massimo vantaggio, perché altrimenti la stampa di un'istanza di una classe mostra solo il nome del suo tipo:
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: 5Mantieni description breve e leggibile per le persone. Non è pensato per l’analisi sintattica e non dovrebbe modificare il valore:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Sfida
FacileFai conformare la struct Fraction (numeratore, denominatore) a CustomStringConvertible. La sua description mostra la frazione ai minimi termini: 6/8 viene stampato come 3/4, 4/2 come 2, 0/5 come 0, e una frazione negativa mantiene il segno davanti (-1/2). Scrivi una funzione helper gcd(_:_:) per la riduzione.
Il codice fornito legge le frazioni a/b, una per riga, e stampa ciascuna con print.
Il tuo codice va in Fraction.swift e Functions.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Código de entrada/salida proporcionado: déjalo tal como está
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]))
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift