lazy özellikler, Swift'te yalnızca onlara ilk erişim sırasında hesaplanır. Bu genellikle hemen ihtiyaç duyulmayan, kaynak açısından pahalı nesneler (örneğin, yoğun hesaplamalar, ağ yüklemeleri) için kullanılır. lazy anahtar kelimesi ile tanımlanır:
class DataFetcher { lazy var data: Data = self.loadData() func loadData() -> Data { /* … */ } }
Özellikler ve incelikler:
lazy özellikler yalnızca değişkenler (var) için geçerlidir, sabitler (let) için değil.lazy özellikler, yapı kendisi değiştirilmezse çalışmaz.lazy özelliklere eşzamanlı erişimden kaçınılmalıdır.lazy değeri her örnek için ayrı ayrı önbelleğe alınır.Soru: "Lazy property'nin değeri sınıf örneği başlatıldığında mı oluşturulur?"
Cevap: Hayır, değer yalnızca özelliklere ilk erişimde hesaplanır, başlatmada değil.
class Expensive { init() { print("init") } } class Example { lazy var heavy = Expensive() } let foo = Example() // hiçbir şey yazdırmaz _ = foo.heavy // şimdi "init"
Hikaye
İki platformda bir projede, görüntülerin önbelleğini depolamak için lazy dizi (lazy var) kullanıldı. Birden fazla thread'den eşzamanlı erişim sırasında yarış koşulları ortaya çıktı, lazy var mutex'lerle sarıldı — ancak lazy'i unuttular, bu da uygulamanın çökmesine neden oldu.
Hikaye
Genç bir geliştirici, pahalı bir hesaplamayı önbelleğe almak için lazy let tanımlamaya çalıştı. Kod derlenmedi çünkü lazy yalnızca var için geçerliydi: mimariyi yeniden gözden geçirmek zorunda kaldı.
Hikaye
Geliştirici, başlatma sırasında closure içinde self'i yakalayarak lazy property tanımladı. Bu, döngüsel bir referansa yol açtı — nesne, tüm ekranlardan çıkmasına rağmen deinitialize edilmedi.