Lazy Property Swift'te, özelliğin nesne oluşturulurken değil, ilk erişim anında hesaplandığı bir gecikmeli başlatma mekanizmasıdır. Sıradan saklanan özelliklerin aksine, lazy değişkenler kaynak yoğun işlemler için başlatma süresini ve bellek tüketimini önemli ölçüde azaltabilir. Apple Developer Documentation (2026)'ya göre, lazy özellikler yalnızca bir kez başlatılır ve ilk erişimde iş parçacığı güvenlidir.
Önemli Noktalar
Lazy Property, başlatılması ilk erişime kadar ertelenen saklanan bir özelliktir. var bildiriminden önceki lazy anahtar kelimesi, derleyiciye nesne oluşturulurken değeri hesaplamamasını söyler.
Standart durumda, tüm saklanan özellikler bir sınıf veya yapı örneği oluşturulurken başlatılır. Bir özellik karmaşık hesaplamalar, ağ yüklemesi veya dosya sistemi işlemleri gerektiriyorsa, lazy, veriler gerçekten gerekli olana kadar bu işlemi ertelemeye olanak tanır.
Swift by Sundell (2025)'e göre, lazy özellikler iOS uygulamalarında en etkili performans optimizasyon araçlarından biridir. Grafik düzenleyiciler veya analitik panolar gibi ağır başlangıç kurulumuna sahip uygulamalarda başlatma süresini %20–40 azaltabilirler.
Lazy bir özellik bildirmek için var'dan önce lazy anahtar kelimesi gerekir. Değer bir closure veya işlev çağrısı aracılığıyla ayarlanır.
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
Lazy özellik için closure yalnızca bir kez hesaplanır ve sonraki erişimlerde saklanan değeri döndürür. Bu, birden çok adımlı karmaşık yapılandırma için özellikle kullanışlıdır.
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
Birden çok lazy özellik birbirinden bağımsız olarak başlatılır. İki lazy özellik closure'lar aracılığıyla birbirine referans verirse, Swift'in otomatik olarak çözemeyeceği döngüsel bir bağımlılık oluşur.
Başlatma anı, lazy ile sıradan saklanan özellikler arasındaki temel farktır. Başlatma, özelliğin ilk okunması veya yazılması sırasında gerçekleşir, ancak daha önce olmaz.
Başlatma, özelliğe ilk erişimde (okuma veya yazma) tetiklenir. O ana kadar, özellik için hiçbir bellek ayrılmaz — yalnızca “başlatılmamış” bayrağı saklanır.
class ReportGenerator {
lazy var report: String = {
print("Rapor oluşturuluyor...")
return "Annual report data"
}()
}
let generator = ReportGenerator()
// bu noktada rapor henüz oluşturulmadı
print(generator.report) // "Rapor oluşturuluyor..."
print(generator.report) // sonraki erişimlerde yeniden oluşturulmaz
Lazy özellikler alt sınıflarda geçersiz kılınamaz. Bir sınıf lazy özellik bildirirse, alt sınıf onu farklı davranışa sahip hesaplanmış veya saklanan bir özellik olarak geçersiz kılamaz.
Apple Swift Blog (2025)'e göre, bu sınırlama lazy'nin bir geçersiz kılma değiştiricisi değil, bir depolama uygulama detayı olmasından kaynaklanır. Bir alt sınıf yalnızca lazy özelliğin closure'ında çağırdığı yöntemi geçersiz kılabilir.
Swift'te bir lazy özelliğin başlatılması iş parçacığı güvenlidir: iki iş parçacığı aynı anda bir lazy özelliğe erişirse, başlatma yalnızca bir kez gerçekleşir ve ikinci iş parçacığı tamamlanana kadar bloke edilir.
Ancak, başlatmadan sonra senkronizasyon kaldırılır. Bu, birden çok iş parçacığından eşzamanlı okumaların güvenli olduğu, ancak bir iş parçacığı lazy var'a yeni bir değer yazarken diğeri okursa veri yarışı oluştuğu anlamına gelir.
Swift Evolution teklifi SE-0254 (2025)'e göre, lazy özellikler için senkronizasyon mekanizması düşük seviyede objc_sync_enter/exit aracılığıyla uygulanır. Bu, atomik başlatmayı garanti eder, ancak sonraki mutasyonları garanti etmez. Değişebilir lazy özelliklerle iş parçacığı güvenli çalışma için ayrı senkronizasyon mekanizmaları kullanın.
Lazy özellikler, performansı optimize etmek ve kod mimarisini iyileştirmek için Swift projelerinde kullanılır.
Görüntü yükleme, JSON ayrıştırma, veritabanlarıyla çalışma — tüm bu işlemler, kullanıcının verilere gerçekten ihtiyaç duyana kadar lazy kullanılarak ertelenebilir.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
Uygulama başlatıldığında hemen ihtiyaç duyulmayan hizmetler ve yöneticiler etkili bir şekilde lazy olarak bildirilir. Bu, başlatma süresini ve bellek tüketimini azaltır.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
Storyboard olmadan programlı olarak arayüz oluştururken, lazy özellikler init'i karmaşıklaştırmadan UI öğesi başlatmayı düzenlemeye olanak tanır.
İlk sınırlama: lazy, let ile kullanılamaz. Bir sabit, init tamamlanmadan önce başlatılmalıdır, bu da gecikmeli başlatma fikriyle çelişir.
İkinci sınırlama: lazy, hesaplanmış özellikler için kullanılamaz. Hesaplanmış özellikler bir değer saklamazken, lazy gecikmeli başlatmalı saklanan bir özelliktir.
Üçüncü sınırlama: yapılardaki lazy özellikler mutasyon sorunlarına neden olabilir. Lazy özelliğe sahip bir yapı let olarak bildirilirse, özelliğe erişim imkansızdır çünkü başlatma yapının mutasyonunu gerektirir.
Dördüncü: lazy özellikler başlatma sırasında willSet/didSet'i tetiklemez. Yalnızca özellik var olarak bildirilmişse, sonraki değişikliklerde tetiklenir.
Stack Overflow (2025)'e göre, lazy ile ilgili soruların yaklaşık %15'i lazy'yi let bağlamında kullanma girişimi veya tek seferlik başlatmanın yanlış anlaşılmasıyla ilgilidir. Sınıflar tasarlanırken bu sınırlamaları dikkate almak önemlidir.
Sıkça Sorulan Sorular
Hayır, lazy yalnızca var için kullanılabilir. let ile bildirilen sabitler, init tamamlanmadan önce başlatılmalıdır, bu da gecikmeli başlatma ile uyumsuzdur.
Tam olarak bir kez. İlk erişimde özellik başlatılır, ardından yeniden hesaplama yapmadan saklanan değeri döndürür.
Başlatma iş parçacığı güvenlidir — iki iş parçacığı özelliği iki kez başlatmaz. Ancak, sonraki mutasyonlar otomatik olarak senkronize edilmez.
Hayır, lazy özellikler geçersiz kılınamaz. Bir alt sınıf yalnızca closure içindeki mantığı değiştirebilir, ancak lazy başlatmanın kendisini değiştiremez.
Lazy, bir kez hesaplanan ve değeri saklayan bir saklanan özelliktir. Hesaplanmış özellik her erişimde hesaplanır ve değer saklamaz.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun