CustomStringConvertible
Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 37 sur 57.
Lorsque vous affichez une valeur, Swift montre par défaut son type et ses propriétés, et uniquement le nom du type pour une classe. Se conformer à CustomStringConvertible et fournir description permet de contrôler le texte :
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))Sortie :
Money(cents: 1250)
$12.50description est utilisé par print, par l’interpolation de chaînes et par String(describing:) ; ainsi, une seule propriété contrôle chaque endroit où la valeur est affichée :
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)Sortie :
start at (2, 5)
[(2, 5), (0, 0)]
6Les classes en bénéficient le plus, car l’affichage d’une instance de classe montre sinon uniquement le nom de son type :
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))Sortie :
main.Account
Ada: 5Gardez description court et lisible pour les personnes. Il n’est pas destiné à l’analyse syntaxique et ne doit pas modifier la valeur :
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}Défi
FacileFaites en sorte que la structure Fraction (numérateur, dénominateur) soit conforme à CustomStringConvertible. Sa description affiche la fraction sous forme irréductible : 6/8 s’affiche comme 3/4, 4/2 comme 2, 0/5 comme 0, et une fraction négative conserve le signe devant (-1/2). Écrivez une fonction auxiliaire gcd(_:_:) pour la réduction.
Le code fourni lit des fractions a/b, une par ligne, et affiche chacune avec print.
Votre code va dans Fraction.swift et Functions.swift. main.swift contient le code fourni d’entrée/sortie et ne peut pas être modifié.
Essayez vous-même
// Code d'entrée/sortie fourni : le garder tel quel
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]))
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesMéthodes et selfInitialiseursLes classes sont des référencesRécapitulatif - Carte de bibliothèque4Encapsulation
Contrôle d’accèsLecture seule depuis l’extérieurProtection de l’étatInitialiseurs pouvant échouerRécapitulatif - Compte bancaire7Polymorphisme et génériques
PolymorphismeConversion de typeFonctions génériquesTypes génériquesRécapitulatif - Calculateur de formes2Structures et types valeur
StructuresSémantique de valeurMéthodes mutantesStructure ou classeRécapitulatif - article d’inventaire5Héritage
Sous-classesRedéfinition des méthodesInitialiseurs et superfinal et hiérarchiesRécapitulatif - hiérarchie des employés8Protocoles standard
CustomStringConvertibleEquatableComparableHashableRécapitulatif - Tri personnalisé11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Swift