Nicht mutierende Alternativen
Geben Sie neue Werte zurück, statt sie direkt zu verändern.
Nicht mutierende Alternativen ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Zurückgeben statt mutieren
Statt eine Instanz direkt zu ändern, kann eine nicht mutierende Methode einen vollständig neuen Wert zurückgeben, auf den die Änderung angewendet wurde.
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)Das Original bleibt unverändert
Da nichts mutiert wird, bleibt der ursprüngliche Wert erhalten und ein neuer Wert wird erzeugt.
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)Funktioniert mit let-Instanzen
Nicht mutierende Methoden können auf let-Konstanten aufgerufen werden, da sie den Empfänger nicht ändern.
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)Namenskonvention
Swift-Konvention: Mutierende Methoden verwenden Imperative (sort), nicht mutierende Methoden Partizip- oder -ed/-ing-Formen (sorted).
var nums = [3, 1, 2]
let ordered = nums.sorted()
nums.sort()
print(ordered, nums)sorted gegenüber sort
Die Standardbibliothek folgt dieser Konvention: sorted() gibt ein neues Array zurück, während sort() das Array direkt ändert.
let a = [5, 2, 8, 1]
let b = a.sorted()
print(a)
print(b)reversed gegenüber reverse
Ebenso ist reversed() nicht mutierend. Hier materialisieren wir das Ergebnis mit Array.
let a = [1, 2, 3]
let b = Array(a.reversed())
print(a, b)Nicht mutierende Aufrufe verketten
Nicht mutierende Methoden geben Werte zurück, sodass Sie sie elegant verketten können.
let result = [4, 2, 9, 1].sorted().map { $0 * 2 }
print(result)Funktionaler Stil
Das Zurückgeben neuer Werte statt einer Mutation unterstützt einen funktionalen Stil, der sich leicht testen und nachvollziehen lässt.
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)Fehler durch gemeinsam genutzten Zustand vermeiden
Das Erzeugen neuer Werte verhindert unbeabsichtigte gemeinsame Mutationen, was besonders bei mehreren Threads hilfreich ist.
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)Wann Sie stattdessen mutieren sollten
Wenn Sie eine Instanz in einer Schleife wiederholt aktualisieren, kann eine direkte Mutation effizienter sein, als viele Kopien zu erzeugen.
var total = 0
for n in 1...5 {
total += n
}
print(total)Beides anbieten
Gut entworfene Typen bieten manchmal wie die Standardbibliothek beide Varianten an, sodass Aufrufer zwischen Mutation und einem neuen Wert wählen können.
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)Kurzer Test
Testen Sie das nicht mutierende Design.
Zusammenfassung
Als Alternative zur Mutation gibt eine nicht mutierende Methode einen neuen Wert zurück, auf den die Änderung angewendet wurde. Das Original bleibt unverändert, und die Methode funktioniert mit let-Instanzen. Nach der Swift-Konvention werden imperative Namen (sort) mit -ed/-ing-Namen (sorted) gepaart.
let a = [3, 1, 2]
let b = a.sorted()
print(a, b)Häufig gestellte Fragen
Ist die Lektion „Nicht mutierende Alternativen“ kostenlos?
Ja — der vollständige Text von „Nicht mutierende Alternativen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Nicht mutierende Alternativen“?
Geben Sie neue Werte zurück, statt sie direkt zu verändern. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Nicht mutierende Alternativen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Wertetypen und Unveränderlichkeit
- Das Schlüsselwort mutating
- Mutating und Neuzuweisung von self
- Nicht mutierende Alternativen