Menu
Coddy logo textTech

Observateurs de propriétés

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

Un observateur de propriété exécute du code chaque fois qu’une propriété stockée change. didSet s’exécute juste après l’enregistrement de la nouvelle valeur, et à l’intérieur, oldValue contient la valeur précédente :

class Player {
    var score = 0 {
        didSet {
            print("score \(oldValue) -> \(score)")
        }
    }
}

let p = Player()
p.score = 10
p.score += 5

Sortie :

score 0 -> 10
score 10 -> 15

willSet s’exécute avant la modification, avec la valeur entrante comme newValue. Les observateurs ne s’exécutent pas lorsque la propriété reçoit sa valeur initiale :

struct Thermostat {
    var target = 20 {
        willSet { print("changing to \(newValue)") }
        didSet { print("changed from \(oldValue)") }
    }
}

var t = Thermostat()
t.target = 22

Sortie :

changing to 22
changed from 20

didSet est un bon endroit pour maintenir une valeur valide. Affecter une valeur à la propriété dans son propre didSet ne déclenche pas à nouveau l’observateur :

struct Volume {
    var level = 5 {
        didSet {
            if level > 10 { level = 10 }
            if level < 0 { level = 0 }
        }
    }
}

var v = Volume()
v.level = 42
print(v.level)
v.level = -3
print(v.level)

Sortie :

10
0

Les observateurs peuvent également conserver un historique ou mettre à jour un état associé, ce qui permet de garder cette logique à proximité de la propriété au lieu de la disperser dans le code :

class Account {
    var history: [Int] = []
    var balance = 0 {
        didSet { history.append(balance - oldValue) }
    }
}

let a = Account()
a.balance = 100
a.balance = 70
print(a.history)

Sortie :

[100, -30]
challenge icon

Défi

Facile

Complétez la classe Tank. Sa propriété stockée level doit rester entre 0 et capacity : ajoutez un didSet qui corrige les valeurs en dehors de cette plage et qui ajoute l’avertissement low à alerts chaque fois que le niveau corrigé se retrouve inférieur à 20 % de la capacité (et que le niveau précédent n’était pas bas).

Le code fourni lit la capacité, puis applique +n ou -n. Il affiche le niveau après chaque modification et, enfin, alerts: suivi du nombre d’avertissements.

Votre code doit être placé dans Tank.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) }
let tank = Tank(capacity: Int(input[0])!)
for cmd in input.dropFirst() {
    let n = Int(cmd.dropFirst())!
    tank.level += cmd.hasPrefix("+") ? n : -n
    print(tank.level)
}
print("alerts: \(tank.alerts.count)")
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