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.0Comme 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 LovelaceUne 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.0Utilisez 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
}
}Défi
FacileComplé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)
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 livres3Les propriétés en profondeur
Propriétés calculéesObservateurs de propriétésMembres statiquesÉnumérations avec méthodesRécapitulatif - Journal des températuresEntraînez-vous par vous-même : Playground Swift