CustomStringConvertible
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 37 de 57.
Quando você imprime um valor, o Swift mostra seu tipo e suas propriedades por padrão, e, para uma classe, apenas o nome do tipo. A conformidade com CustomStringConvertible e o fornecimento de description controlam o 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))Saída:
Money(cents: 1250)
$12.50description é usada por print, pela interpolação de strings e por String(describing:), portanto uma propriedade controla todos os lugares onde o valor é mostrado:
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)Saída:
start at (2, 5)
[(2, 5), (0, 0)]
6As classes são as que mais se beneficiam, pois imprimir uma instância de classe, caso contrário, mostra apenas o nome do 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))Saída:
main.Account
Ada: 5Mantenha description curto e legível para as pessoas. Ele não foi feito para análise e não deve alterar o valor:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}Desafio
FácilFaça a struct Fraction (numerador, denominador) estar em conformidade com CustomStringConvertible. Sua description exibe a fração em sua forma irredutível: 6/8 é exibido como 3/4, 4/2 como 2, 0/5 como 0, e uma fração negativa mantém o sinal na frente (-1/2). Escreva uma função auxiliar gcd(_:_:) para a redução.
O código fornecido lê frações a/b, uma por linha, e exibe cada uma com print.
Seu código deve estar em Fraction.swift e Functions.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
// Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Swift