W Swift struktury (struct) są domyślnie typami wartości: przy kopiowaniu instancji struktury tworzona jest niezależna kopia. Jednak w przeciwieństwie do klas, metody struktury nie mogą zmieniać self ani jej właściwości bez bezpośredniego zezwolenia kompilatorowi. W wcześniejszych wersjach języków C i C++ struktury były zawsze zmienne, co prowadziło do nieoczekiwanych skutków ubocznych. Swift zwiększa bezpieczeństwo, wymagając wyraźnego oznaczenia metod, które zmieniają stan struktury, słowem kluczowym mutating.
Problem pojawia się, gdy metoda jest potrzebna do zmiany właściwości struktury, ale jest zadeklarowana jako zwykła, i kompilator nie zezwala na to. Bez mutating nie można zmieniać self ani jego właściwości.
Rozwiązanie — oznaczać takie metody za pomocą słowa kluczowego mutating, co daje kompilatorowi sygnał, aby zezwolił na zmianę self oraz zagnieżdżonych właściwości.
Przykład kodu:
struct Counter { var value = 0 mutating func increment() { value += 1 } // Ta metoda NIE będzie kompilowana, jeśli usuniemy mutating } var counter = Counter() counter.increment() // value stał się równy 1
Kluczowe cechy:
1. Czy można wywoływać metody mutujące na strukturze zadeklarowanej przez let?
Nie, nie można. Stałe wartości let struktur nie mogą być zmieniane, nawet za pomocą metod mutujących.
let counter = Counter() counter.increment() // Błąd kompilacji
2. Czy zagnieżdżone właściwości klasy wewnątrz struktury mogą być zmieniane wewnątrz metody mutującej struktury?
Tak, jeśli właściwość struktury to typ referencyjny (np. klasa), to jej wewnętrzne właściwości można zmieniać nawet bez mutating, ale całą strukturę — tylko za pomocą mutating.
class State { var value = 0 } struct Wrapper { var state = State() mutating func change() { state.value += 1 } }
3. Czy można zmieniać tylko computed property wewnątrz metody bez mutating?
Nie. Jeśli computed property ma set, to zmiana jego wartości wewnątrz metody wciąż wymaga mutating.
W projekcie zrealizowano prosty licznik na strukturze, ale programista zapomniał oznaczyć metodę jako mutating. Testy nie przechodzą, ponieważ wartość się nie zmienia.
Zalety:
Wady:
Metody w strukturze oznaczone jako mutating, testy przechodzą, zmiany aktualizują się poprawnie. Kod jest zrozumiały dla wszystkich członków zespołu.
Zalety:
Wady: