CustomStringConvertible
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 37 de 57.
Al imprimir un valor, Swift muestra su tipo y sus propiedades de forma predeterminada, y para una clase solo el nombre del tipo. Adoptar CustomStringConvertible y proporcionar description controla el texto:
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))Salida:
Money(cents: 1250)
$12.50description se utiliza mediante print, la interpolación de cadenas y String(describing:), por lo que una propiedad controla todos los lugares donde se muestra el valor:
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)Salida:
start at (2, 5)
[(2, 5), (0, 0)]
6Las clases son las que más se benefician, porque imprimir una instancia de una clase, de lo contrario, solo muestra su nombre de 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))Salida:
main.Account
Ada: 5Mantén description breve y legible para las personas. No está destinado al análisis sintáctico y no debería cambiar el valor:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Desafío
FácilHaz que la estructura Fraction (numerador, denominador) sea conforme a CustomStringConvertible. Su description muestra la fracción en sus términos más simples: 6/8 se imprime como 3/4, 4/2 como 2, 0/5 como 0, y una fracción negativa conserva el signo delante (-1/2). Escribe una función auxiliar gcd(_:_:) para la reducción.
El código proporcionado lee fracciones a/b, una por línea, e imprime cada una con print.
Tu código va en Fraction.swift y Functions.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
// Código de entrada/salida suministrado: 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]))
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift