Menu
Coddy logo textTech

Méthodes mutantes

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

Une méthode de structure qui modifie une propriété doit être marquée mutating. Sans ce mot-clé, la méthode ne compile pas, car les méthodes d’un type valeur traitent self comme une constante :

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
c.increment()
print(c.count)

Sortie :

2

Une méthode mutante ne peut être appelée que sur un var. Sur une constante let, l'appel ne compile pas, car toute la valeur est fixe :

var a = Counter()
a.increment()        // correct

let b = Counter()
// b.increment()     // erreur : b est une constante let

Les méthodes qui se contentent de lire les propriétés restent non mutantes et fonctionnent aussi sur les constantes. Une bonne conception regroupe les modifications dans quelques méthodes mutantes :

struct Stack {
    var items: [Int] = []

    mutating func push(_ x: Int) { items.append(x) }
    mutating func pop() -> Int? { items.popLast() }
    func peek() -> Int? { items.last }
}

var s = Stack()
s.push(3)
s.push(8)
print(s.pop() ?? -1)
print(s.peek() ?? -1)

Sortie :

8
3

Une méthode mutante peut remplacer entièrement self, ce qui est pratique pour réinitialiser une valeur :

struct Score {
    var points = 0
    var bonus = 0

    mutating func reset() {
        self = Score()
    }
}

var s = Score(points: 10, bonus: 3)
s.reset()
print(s.points + s.bonus)

Sortie :

0
challenge icon

Défi

Facile

Complétez la structure Wallet. add(_:) et spend(_:) sont mutantes : spend soustrait uniquement lorsqu’il reste suffisamment d’argent et indique si l’opération a réussi. report() n’est pas mutante et renvoie balance 40.

Le code fourni lit les commandes +n et -n, les applique à un unique portefeuille var, affiche denied en cas de dépense refusée, puis affiche finalement report().

Votre code doit être placé dans Wallet.swift. main.swift contient le code fourni pour les entrées/sorties et ne peut pas être modifié.

Essayez vous-même

// Code d'entrée/sortie fourni : le laisser tel quel
var input: [String] = []
while let line = readLine() { input.append(line) }
var wallet = Wallet()
for cmd in input {
    let amount = Int(cmd.dropFirst())!
    if cmd.hasPrefix("+") {
        wallet.add(amount)
    } else if !wallet.spend(amount) {
        print("denied")
    }
}
print(wallet.report())
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