ProgramlamaiOS/Swift geliştirici

Swift'te defer ifadeleri nedir? Çalıştırma özellikleri nelerdir, nerelerde kullanılabilir ve hangi zorluklarla karşılaşılabilir?

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

Cevap.

Sorunun geçmişi:

Defer, Swift'e (Go, C#'taki benzerlerinden ilham alınarak) hata oluştuğunda, işlevden çıkıldığında veya işlevin farklı noktalarından değer dönerken kaynakların garantili bir şekilde temizlenmesi için eklenmiştir.

Sorun:

Erken serbest bırakma, unutulan kaynak temizlemeleri (örneğin, dosyaların kapatılması, günlüğe kaydetme, işlem geri alma). Bazen yürütme sırası ile karıştırılır ve defer'in tanımlandığı anda çalıştırıldığına inanılır.

Çözüm:

Defer, mevcut alanın (scope) sonuna kadar kodun çalıştırılmasını erteleyen özel bir bloktur, genellikle işlevde. Tüm defer, yerleştirme sırasına ters (LIFO) olarak çalıştırılır. Bu, kaynakların temizlenmesi, hafızanın serbest bırakılması veya işlemlerin geri alınması üzerinde merkezi bir kontrol sağlamaktadır.

Kod örneği:

func processFile() { let file = File("/tmp/data.txt") file.open() defer { file.close() print("Dosya kapatıldı") } // Dosya ile çalışma print("Veri okunuyor…") }

Ana özellikler:

  • Scope'dan çıkış yapılırken her zaman çalıştırılır, hata oluşsa bile ve erken return olsa bile.
  • Birden fazla defer ters sırayla çalıştırılır.
  • Herhangi bir alanda kullanılabilir, sadece işlevlerde değil.

İkna edici sorular.

Defer içindeki kod, uygulama çökmeden önce işlevden çıkarken çalıştırılır mı?

Hayır, defer kodu sadece görünürlük alanından (scope) düzgün bir şekilde çıkıldığında çalıştırılır. Uygulama beklenmedik bir şekilde kapanırsa (örneğin, fatal error), defer çalıştırılmaz.

Defer içinde return kullanılabilir mi?

Hayır, kullanılmaz. Defer bloğu değer döndürme veya alanı sonlandırmayı kabul etmez, sadece talimatlar.

Defer, defer'den önce tanımlanan değişkenlerin değiştirilmesinde kullanılabilir mi?

Evet, defer, yürütme anında mevcut yığın değerlerini yakalar. Defer'den önce tanımlanan değerler değiştirilebilir ve alanın çıkışında korunur.

Kod örneği:

func example() -> Int { var result = 0 defer { result = 42 } return result // defer çalışacak, sonuç — 42 }

Yaygın hatalar ve anti-paternler

  • Defer'in hemen tanımlandıktan sonra çalışacağına dair yanlış bir beklenti.
  • Anlam taşımayan bir alanda defer kullanımı.
  • Defer içinde ağır işlemler bırakmak.

Gerçek hayattan bir örnek

Olumsuz durum

Dosya açılır, ancak işlevin en altında açıkça kapatılmadığı için, hatalar veya işlevden erken çıkış durumlarında dosya açık kalır.

Artılar:

  • Uygulaması kolay

Eksiler:

  • Hatalarda dosya kapanmaz
  • Kaynak sızıntısı

Olumlu durum

Dosyayı açar açmaz kapatmak için defer kullanımı. Bir istisna meydana gelse bile veya işlevden dönüldüğünde dosya garantili olarak kapanacaktır.

Artılar:

  • Güvenli, sızıntı yok
  • Temiz ve öngörülebilir kod

Eksiler:

  • Defer içinde değişken kaynaklarla dikkatli olunması gerekir.