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 :
2Une 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 letLes 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
3Une 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 :
0Défi
FacileComplé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())
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 livresEntraînez-vous par vous-même : Playground Swift