In Swift sind Strukturen (struct) standardmäßig Werttypen: beim Kopieren einer Strukturinstanz wird eine unabhängige Kopie erstellt. Im Gegensatz zu Klassen können Methoden von Strukturen jedoch self und ihre Eigenschaften nicht ohne direkte Erlaubnis des Compilers ändern. In früheren Versionen der Programmiersprachen C und C++ waren Strukturen immer veränderbar, was zu unerwarteten Nebenwirkungen führte. Swift erhöht die Sicherheit, indem es verlangt, dass Methoden, die den Zustand einer Struktur ändern, mit dem Schlüsselwort mutating ausdrücklich gekennzeichnet werden.
Das Problem tritt auf, wenn eine Methode benötigt wird, um die Eigenschaften einer Struktur zu ändern, aber als gewöhnlich deklariert ist, und der Compiler dies nicht zulässt. Ohne mutating ist es nicht möglich, self oder seine Eigenschaften zu ändern.
Die Lösung besteht darin, solche Methoden mit dem Schlüsselwort mutating zu deklarieren, was dem Compiler das Signal gibt, die Änderung von self und eingebetteten Eigenschaften zu erlauben.
Beispielcode:
struct Counter { var value = 0 mutating func increment() { value += 1 } // Diese Methode wird NICHT kompiliert, wenn mutating entfernt wird } var counter = Counter() counter.increment() // value ist gleich 1 geworden
Wichtige Merkmale:
1. Kann man mutierende Methoden auf einer Struktur, die über let deklariert ist, aufrufen?
Nein, das kann man nicht. Konstante let-Werte von Strukturen können nicht verändert werden, selbst nicht mit mutierenden Methoden.
let counter = Counter() counter.increment() // Kompilierungsfehler
2. Können innere Eigenschaften einer Klasse innerhalb einer mutierenden Methode einer Struktur verändert werden?
Ja, wenn die Eigenschaft der Struktur ein Referenztyp (zum Beispiel eine Klasse) ist, können dessen innere Eigenschaften auch ohne mutating geändert werden, aber die gesamte Struktur nur über mutating.
class State { var value = 0 } struct Wrapper { var state = State() mutating func change() { state.value += 1 } }
3. Kann eine computed property innerhalb einer Methode ohne mutating geändert werden?
Nein. Wenn die computed property ein set hat, erfordert die Änderung ihres Wertes innerhalb der Methode dennoch mutating.
In einem Projekt wurde ein einfacher Zähler in einer Struktur implementiert, aber der Entwickler hat vergessen, die Methode als mutating zu kennzeichnen. Die Tests bestehen nicht, weil sich der Wert nicht ändert.
Vorteile:
Nachteile:
Die Methoden in der Struktur sind mit mutating bezeichnet, die Tests bestehen, und die Änderungen werden korrekt aktualisiert. Der Code ist für alle Teammitglieder verständlich.
Vorteile:
Nachteile: