ProgramlamaiOS geliştirici

Swift'te Lazy Collections nedir ve ne zaman kullanılması makuldür?

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

Cevap.

Lazy Collections (tembel koleksiyonlar), Swift 2 ile ortaya çıkan özel bir mekanizmadır; bu mekanizma, koleksiyonlar üzerindeki hesaplamaları sonuçla doğrudan etkileşim anına kadar ertelemeyi mümkün kılar. Başlangıçta koleksiyonların standart yöntemleri (örneğin, map, filter), yeni koleksiyonun tamamen hesaplanmış sonucunu döndürüyorlardı; bu durum, özellikle büyük diziler veya dönüşüm zincirleri ile çalışırken, gereksiz bellek ve zaman israfına yol açabiliyordu.

Sorun, ara koleksiyonların gereksiz yere oluşturulmasıdır. Her map veya filter çağrısı yeni bir veri kopyası oluşturur ki bu da birden fazla dönüşümde programın performansını ciddi derecede düşürür.

Çözüm ise, .lazy özelliğini kullanarak tembel koleksiyonlardır. Swift, tüm işlemleri tek bir zincirde birleştirir ve yalnızca gerçekten erişilen elemanları hesaplar.

Kod örneği:

let array = Array(1...1_000_000) let result = array.lazy.filter { $0 % 2 == 0 }.map { $0 * 3 } print(result.prefix(5)) // Sadece ilk 5 değer hesaplanacak

Anahtar özellikler:

  • Hesaplamalar yalnızca elemana erişim anında (talep üzerine) gerçekleştirilir.
  • Map/filter zincirlerinde ara diziler oluşturulmaz.
  • Büyük verilerde bellek ve zaman tasarrufu sağlar.

Yanıltıcı Sorular.

Soru 1: let b = a.lazy.map { ... } hemen hesaplama sonucunu mu döner?

Hayır, .lazy ve map/filter yöntemleri kullanıldığında, hesaplama sonucu yalnızca verilere doğrudan erişimle (örneğin, for-in, first, reduce üzerinden) dönecektir.

Kod örneği:

let array = [1, 2, 3] let mapped = array.lazy.map { x in print("işleniyor\(x)") return x * 2 } // Bu aşamada hiçbir şey yazdırılmaz let first = mapped.first // İşte burada hesaplamalar başlayacak ve çıktı oluşacak

Soru 2: .lazy'den sonra mevcut koleksiyona yeni bir eleman ekleyebilir miyim ve daha sonra erişildiğinde o eleman da işlenir mi?

Hayır, Lazy Collection, tembel görünüm oluşturuş anındaki koleksiyonun durumunu yansıtır. Sonradan eklenen elemanlar dikkate alınmayacaktır.

Soru 3: Küçük koleksiyonlar (<100 eleman) için .lazy kullanımı etkili midir?

Hayır, küçük koleksiyonlar için tembel hesaplamalardan elde edilen kazanç hemen hemen fark edilmez ve bazen ek yükleme performansı olumsuz etkileyebilir.

Tipik Hatalar ve Anti-Desenler

  • Tembel zincirin sonucuna erişmeyi unutur ve verilerin zaten hesaplandığını düşünüp beklerler.
  • Küçük dizilerde .lazy kullanarak kodu karmaşık hale getirip performans kazancı elde edemezler.
  • Tembel görünüm oluşturduktan sonra mevcut koleksiyonu değiştirirler ve değişikliklerin algılanmasını beklerler.

Hayattan Örnek

Olumsuz Durum

Projede, küçük koleksiyonlarda bile .lazy’yi düşünmeden tüm map/filter’lara uyguladılar.

Artılar:

  • Kod tarzının birleştirilmesi.

Eksiler:

  • Sürekli tembel sarmalayıcılar oluşturulduğu için performans düştü.
  • Hatalar oluştu: hesaplamalar yapılmadı ve veriler zamanında işlenmedi.

Olumlu Durum

Büyük işlem veritabanlarındaki raporları, uzun dönüşüm zincirlerinin olduğu fonksiyonlar için yalnızca .lazy kullanarak yeniden yapılandırdık.

Artılar:

  • Çalışma süresi kayda değer şekilde azaldı.
  • Bellek daha az kullanıldı, özellikle sonuçların yalnızca ilk birkaç elemanını aldığımızda.

Eksiler:

  • Bu tür kod bölümleri için ek belgeler gerekliydi.