ProgramlamaOrta Düzey iOS Geliştirici

Swift'teki mutating fonksiyonlarının mekanizması nasıl çalışır ve value tiplerin durumunu değiştirmek için neden gereklidir? Mutating yöntemlerin getirdiği kısıtlamalar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Yalnızca mutating olan metodlar self'i ve özelliklerini değiştirebilir.
  • Mutating metodları sabitler (let örnekleri) üzerinde çağrılamaz.
  • Yapılar içinde self mutating metod içinde tamamen değiştirilebilir.

Beklenmedik Sorular.

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.

Yaygın Hatalar ve Anti-Desenler

  • Metodu mutating olarak tanımlamayı unutmak, özellik değişikliklerini derlemeyi engeller.
  • Durum değişikliği sıkça gerektiren yerlerde yapıları kullanmak — bu tür durumlar için sınıf daha iyidir.
  • Değişikliklerde yapıların kopyalanma özelliklerini göz ardı etmek.

Gerçek Hayat Örneği

Negatif Durum

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:

  • Fonksiyonellik hızlı bir şekilde gerçekleştirilmiştir.

Eksiler:

  • Geliştirici hatayı anlamıyor, sebebi araştırmak için zaman kaybediliyor.
  • Değişiklikler kaydedilmiyor, kodda karışıklık ortaya çıkıyor.

Pozitif Durum

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:

  • Katı tipler ve öngörülebilir davranış.
  • Yüksek hata toleransı.

Eksiler:

  • Sinyatürde mutating'i hatırlamak için ek bir yükümlülük doğuyor.