0Pricing
Swift Academy · Lektion

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

  1. Wertetypen und Unveränderlichkeit
  2. Das Schlüsselwort mutating
  3. Mutating und Neuzuweisung von self
  4. Nicht mutierende Alternativen
← Zurück zu Swift Academy