Swift'te yapılar (struct) varsayılan olarak value type'tır: bir yapı örneği kopyalandığında bağımsız bir kopya oluşturulur. Ancak, sınıfların aksine, yapıların metodları self'ü ve özelliklerini doğrudan değiştiremez, derleyici tarafından izin verilmedikçe. C ve C++ dillerinin daha eski sürümlerinde yapılar her zaman değiştirilebilir olduğundan, beklenmedik yan etkiler ortaya çıkıyordu. Swift, yapı durumunu değiştiren metodları açıkça mutating anahtar kelimesiyle işaretlemeyi zorunlu kılarak güvenliği artırır.
Eğer bir metod, bir yapının özelliklerini değiştirmek için gerekli ise fakat normal bir metod olarak tanımlanmışsa, derleyici bunu yapmaya izin vermez. Mutating olmadan self'ü veya özelliklerini değiştirmek mümkün değildir.
Çözüm, bu tür metodları mutating anahtar kelimesiyle tanımlamaktır; bu, derleyiciye self'in ve içindeki özelliklerin değişimine izin vermesi için işaret eder.
Kod örneği:
struct Counter { var value = 0 mutating func increment() { value += 1 } // Bu metod mutating kaldırılırsa derlenmeyecek } var counter = Counter() counter.increment() // value 1 oldu
Ana özellikler:
1. let ile tanımlanmış bir yapı üzerinde mutating metodları çağırmak mümkün mü?
Hayır, mümkün değildir. Sabit let değerleri yapıların değişmesine izin vermez, mutating metodlarla bile.
let counter = Counter() counter.increment() // Derleme hatası
2. Yapı içinde bulunan bir sınıfın iç özellikleri, yapı içindeki mutating metod içinde değiştirilebilir mi?
Evet, eğer yapının özelliği bir referans tip (örneğin, sınıf) ise, iç özellikleri değiştirmek mutating olmadan da mümkündür, ancak yapıyı tamamen yalnızca mutating ile değiştirebilirsiniz.
class State { var value = 0 } struct Wrapper { var state = State() mutating func change() { state.value += 1 } }
3. İçerisinde mutating olmadan yalnızca hesaplanan bir özelliği değiştirmek mümkün mü?
Hayır. Eğer hesaplanan bir özelliğin set'i varsa, metod içinde değerini değiştirmek yine mutating gerektirir.
Bir projede yapı üzerinde basit bir sayaç uygulanmıştır, ancak geliştirici metodu mutating olarak işaretlemeyi unutmuştur. Testler geçmiyor çünkü değer değişmiyor.
Artılar:
Eksiler:
Yapı içindeki metodlar mutating olarak işaretlenmiştir, testler geçiyor, değişiklikler düzgün bir şekilde güncelleniyor. Kod ekipteki herkes için anlaşılır durumda.
Artılar:
Eksiler: