Menu
Coddy logo textTech

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

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

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

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

Défi

Facile

Faites 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]))
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Swift