Menu
Coddy logo textTech

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

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

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

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

Sfida

Facile

Fai 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]))
}
quiz iconMettiti alla prova

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

Esercitati da solo: Playground Swift