ProgramlamaSwift geliştiricisi

Swift'te defer nedir, ne için kullanılır ve kullanımında hangi tuzaklar vardır?

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

Yanıt.

Sorunun Tarihçesi:

defer, Swift'te kaynakların daha düzgün bir şekilde yönetilmesi ve kod bloğu tamamlandıktan sonra işlemlerin gerçekleştirilmesi için tanıtılmıştır, diğer dillerdeki finally anahtar kelimesine benzer. Bu yapı, kaynaklarla ilgili temizleme veya işin sona erme aşamalarını açıkça göstermeye yardımcı olur.

Sorun:

Birçok yeni başlayan, defer'in içine yerleştirilen kodu hemen çalıştırdığını düşünerek, tetikleme anını her zaman doğru anlamıyor. Ayrıca, birden fazla defer bloğu olduğunda, LIFO (son-giren, ilk-çıkan) kuralı bilinmeden anlamak zorlaşabileceği durumlar da vardır. try/catch ve erken çıkış gibi durumlar karmaşaya neden olabilir.

Çözüm:

defer, içe yerleştirilen kodu, mevcut işlev bloğundan çıkmadan hemen önce, hatta işlevden daha erken çıkış gerçekleşse bile (return, throw, break vb. ile) çalıştırır. Birden fazla defer, göründükleri ters sırada çalıştırılır.

Kod örneği:

func readFile() { print("Dosya açıldı") defer { print("Dosya kapatıldı") } print("1. satırı oku") if Bool.random() { print("Erken dönüş!") return } print("2. satırı oku") } readFile() // Konsolda her zaman: Dosya açıldı, ..., Dosya kapatıldı (sonda)

Anahtar özellikler:

  • defer, işlev/metodun kapsamından çıkıldığında her zaman tetiklenir
  • birden fazla defer yığın (LIFO) prensibine göre çalışır
  • erken return veya hata durumunda bile tetiklenir

Farklı Sorular.

Defer, işlev dışındaki bir yerde kullanılabilir mi?

Hayır, defer yalnızca işlevlerin, metodların, initializers ve deinitializers içinde kullanılabilir. Örneğin, dosyanın global alanında veya fonksiyon dışındaki kod kaynaklarının içinde yerleştirilemez.

Bir blokta exception (throw) olursa defer ile ne olur?

defer yine de çalışacaktır. Bu, onun avantajlarından birisidir — hata (throw) durumunda bile kaynak garanti altında serbest bırakılır. Bu, kaynakların güvenli bir şekilde serbest bırakılması desenini gerçekleştirir.

Birden fazla defer hangi sırayla çalışır?

Ters sırayla çalışırlar (LIFO): daha sonra bildirilmiş olan defer önce çalışır.

Kod örneği:

func test() { defer { print("Birinci") } defer { print("İkinci") } print("İçeride") } test() // Çıktı: "İçeride", "İkinci", "Birinci"

Tipik Hatalar ve Antipatternler

  • Kendi return/throw'larının olabileceği kodlar için defer kullanımı, yürütme sırasının karmaşasına neden olur
  • Defer kullanımı, birçok blokla işlevin okunabilirliğini zorlaştırır
  • Fonksiyon kapsamı dışında defer kullanma çabası

Gerçek Hayattan Örnek

Olumsuz Durum

Birden fazla, ardışık olarak yerleştirilmemiş defer içeren bir fonksiyon; bazı kaynakların serbest bırakılması unutulmuştur, fonksiyona farklı yerlerden dönmekteyiz. Bu, kaynak sızıntılarına ve davranışın zor hata ayıklanmasına yol açar.

Artıları: Kodun tutarlılığı, temizleme eylemleri "toplanmış" bir yerdedir.

Eksileri: Ne zaman ve hangi sırayla çalışacağını takip etmek zordur; mantık hatalarında sızıntılar olabilir.

Olumlu Durum

Her önemli aşama için bir defer yapılır, kaynak ilk defa başlatıldığında orada yer alır ve yorumlar eklenir. Kod incelemesi kontrol edilir.

Artıları: Kaynakların garanti temizlenmesi, eylemler sırasının net olması.

Eksileri: Yeni kaynaklar ve temizleme blokları eklerken disiplin ve dikkat gerektirir.