Menu
Coddy logo textTech

Propriétés calculées

Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 12 sur 57.

Une propriété stockée contient une valeur. Une propriété calculée ne possède aucun stockage : elle exécute du code chaque fois qu’elle est lue et renvoie une valeur calculée à partir d’autres propriétés :

struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        width * height
    }
}

var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)

Sortie :

12.0
40.0

Comme la valeur est recalculée à chaque lecture, une propriété calculée ne peut jamais être obsolète. Elle se lit comme une propriété stockée, sans parenthèses :

struct Person {
    var first: String
    var last: String

    var fullName: String {
        "\(first) \(last)"
    }
}

var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)

Sortie :

Ada Lovelace

Une propriété calculée peut également avoir un setter. set reçoit la nouvelle valeur sous la forme de newValue et met à jour les propriétés stockées sur lesquelles elle repose :

struct Temperature {
    var celsius: Double

    var fahrenheit: Double {
        get { celsius * 9 / 5 + 32 }
        set { celsius = (newValue - 32) * 5 / 9 }
    }
}

var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)

Sortie :

212.0
0.0

Utilisez une propriété calculée pour une valeur qui découle d’autres valeurs et dont le calcul est peu coûteux. Utilisez une méthode lorsque le traitement prend des arguments ou est coûteux :

struct Order {
    var items: [Int]
    var total: Int { items.reduce(0, +) }           // propriété : aucun argument
    func total(withTax rate: Int) -> Int {           // méthode : prend un argument
        total + total * rate / 100
    }
}
challenge icon

Défi

Facile

Complétez la structure Circle avec une propriété stockée radius et trois propriétés calculées en lecture seule : diameter (deux fois le rayon), area (π r², en utilisant Double.pi) et label, qui renvoie r=2.0 d=4.0 a=12.57, avec l’aire arrondie à deux décimales à l’aide de String(format: "%.2f", area).

Le code fourni lit un rayon par ligne, crée un Circle et affiche label. Il double ensuite le rayon du dernier cercle et affiche à nouveau son label ; les valeurs doivent donc suivre le rayon.

Votre code doit être placé dans Circle.swift. main.swift contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

import Foundation

// Code d'entrée/sortie fourni : le garder tel quel
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
    last = Circle(radius: Double(line)!)
    print(last.label)
}
last.radius *= 2
print(last.label)
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