Alternatives non mutantes
Renvoyez de nouvelles valeurs au lieu de modifier sur place.
Alternatives non mutantes est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.
Renvoyer plutôt que modifier
Au lieu de modifier une instance sur place, une méthode non mutante peut renvoyer une toute nouvelle valeur à laquelle le changement a été appliqué.
struct Counter {
var value: Int
func incremented() -> Counter {
return Counter(value: value + 1)
}
}
let c = Counter(value: 0)
let next = c.incremented()
print(c.value, next.value)L'original reste inchangé
Comme rien n'est modifié, la valeur originale est conservée et une nouvelle valeur est produite.
struct Vector {
var x: Int
var y: Int
func scaled(by factor: Int) -> Vector {
return Vector(x: x * factor, y: y * factor)
}
}
let v = Vector(x: 2, y: 3)
let big = v.scaled(by: 10)
print(v.x, v.y, big.x, big.y)Fonctionne avec les instances let
Les méthodes non mutantes peuvent être appelées sur des constantes let, puisqu'elles ne modifient pas le récepteur.
struct Money {
var cents: Int
func plus(_ other: Int) -> Money {
return Money(cents: cents + other)
}
}
let m = Money(cents: 100)
print(m.plus(50).cents)Convention de nommage
Convention Swift : les méthodes mutantes utilisent des verbes à l'impératif (sort), tandis que les méthodes non mutantes utilisent des formes au participe passé ou en -ed/-ing (sorted).
var nums = [3, 1, 2]
let ordered = nums.sorted()
nums.sort()
print(ordered, nums)sorted et sort
La bibliothèque standard suit cette convention : sorted() renvoie un nouveau tableau, tandis que sort() modifie le tableau sur place.
let a = [5, 2, 8, 1]
let b = a.sorted()
print(a)
print(b)reversed et inversion
De même, reversed() ne modifie pas la valeur. Ici, nous matérialisons le résultat avec Array.
let a = [1, 2, 3]
let b = Array(a.reversed())
print(a, b)Chaîner des appels non mutants
Les méthodes non mutantes renvoient des valeurs ; vous pouvez donc les chaîner de manière fluide.
let result = [4, 2, 9, 1].sorted().map { $0 * 2 }
print(result)Style fonctionnel
Renvoyer de nouvelles valeurs au lieu de modifier les valeurs existantes favorise un style fonctionnel, facile à tester et à comprendre.
struct Account {
var balance: Int
func deposited(_ n: Int) -> Account {
return Account(balance: balance + n)
}
}
let a0 = Account(balance: 0)
let a1 = a0.deposited(100).deposited(50)
print(a0.balance, a1.balance)Éviter les bogues liés à l'état partagé
Produire de nouvelles valeurs évite les modifications partagées accidentelles, ce qui est particulièrement utile entre plusieurs fils d'exécution.
struct Settings {
var volume: Int
func with(volume newVolume: Int) -> Settings {
return Settings(volume: newVolume)
}
}
let base = Settings(volume: 5)
let loud = base.with(volume: 11)
print(base.volume, loud.volume)Quand préférer la mutation
Si vous mettez à jour plusieurs fois une même instance dans une boucle, la mutation sur place peut être plus efficace que la création de nombreuses copies.
var total = 0
for n in 1...5 {
total += n
}
print(total)Proposer les deux formes
Les types bien conçus proposent parfois les deux formes, comme la bibliothèque standard, afin que les appelants choisissent entre la mutation et la création d'une nouvelle valeur.
struct Text {
var value: String
func uppercased() -> Text {
return Text(value: value.uppercased())
}
mutating func uppercase() {
value = value.uppercased()
}
}
var t = Text(value: "hi")
let u = t.uppercased()
t.uppercase()
print(u.value, t.value)Vérification rapide
Testez une conception non mutante.
Récapitulatif
Comme alternative à la mutation, une méthode non mutante renvoie une nouvelle valeur à laquelle le changement a été appliqué, en laissant l'original intact et en fonctionnant avec des instances let. La convention Swift associe les noms à l'impératif (sort) aux noms en -ed/-ing (sorted).
let a = [3, 1, 2]
let b = a.sorted()
print(a, b)Apprends Swift avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 122
- Leçons
- 409
Questions Fréquemment Posées
La leçon « Alternatives non mutantes » est-elle gratuite ?
Oui — le texte complet de « Alternatives non mutantes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Alternatives non mutantes » ?
Renvoyez de nouvelles valeurs au lieu de modifier sur place. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Swift Academy ?
Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Alternatives non mutantes » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?
Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Types valeur et immutabilité
- Le mot-clé mutating
- Mutating et réaffectation de self
- Alternatives non mutantes