Swift'te Lazy Property: Nedir ve Tembel Başlatma Sözdizimi

Yazar: IT Sectr Yayınlanma: 2026-06-20 Okuma süresi: 10 dk

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 — özellik ilk erişimde başlatılır, nesne oluşturulurken değil
  • Yalnızca var — lazy, let ile kullanılamaz çünkü sabit başlatmadan önce bilinmelidir
  • İş parçacığı güvenliği — lazy özelliğin başlatılması senkronizedir, ancak sonraki erişim senkronize değildir
  • Tek sefer — lazy tam olarak bir kez hesaplanır, sonraki erişimler saklanan değeri döndürür
  • Optimizasyon — seyrek kullanılan veriler için başlatma süresini ve bellek tüketimini azaltır

Swift'te Lazy Property Nedir?

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 özelliğin sözdizimi

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.

swift
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.

swift
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.

Lazy özellik ne zaman başlatılır

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.

İlk erişim (okuma veya yazma)

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.

swift
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

Kalıtımda davranış

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.

Lazy özelliklerin iş parçacığı güvenliği

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.

Pratik kullanım senaryoları

Lazy özellikler, performansı optimize etmek ve kod mimarisini iyileştirmek için Swift projelerinde kullanılır.

Ağır kaynaklar

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.

swift
class ProfileViewController {
    lazy var avatarImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        return imageView
    }()
}

Singleton bağımlılıkları

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.

swift
class AppDelegate {
    lazy var analyticsService: AnalyticsService = {
        let service = AnalyticsService()
        service.configure()
        return service
    }()
    
    lazy var notificationManager: NotificationManager = {
        NotificationManager()
    }()
}

Kod içinde UI bileşenleri

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.

Sınırlamalar ve tuzaklar

İ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

lazy, let ile kullanılabilir mi?

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.

Lazy özellik kaç kez hesaplanır?

Tam olarak bir kez. İlk erişimde özellik başlatılır, ardından yeniden hesaplama yapmadan saklanan değeri döndürür.

Lazy özellik çoklu iş parçacığı ortamında güvenli midir?

Başlatma iş parçacığı güvenlidir — iki iş parçacığı özelliği iki kez başlatmaz. Ancak, sonraki mutasyonlar otomatik olarak senkronize edilmez.

Lazy özellik alt sınıfta geçersiz kılınabilir mi?

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'nin hesaplanmış özellikten farkı nedir?

Lazy, bir kez hesaplanan ve değeri saklayan bir saklanan özelliktir. Hesaplanmış özellik her erişimde hesaplanır ve değer saklamaz.

Özet

  • Lazy Property — ilk erişimde yürütülen gecikmeli başlatma mekanizması
  • Yalnızca var — lazy, let ile uyumsuzdur çünkü sabit anında başlatma gerektirir
  • Tek sefer — başlatma bir kez gerçekleşir, sonraki erişimler önbelleğe alınmış değeri kullanır
  • İş parçacığı güvenliği — başlatma senkronizedir, ancak başlatma sonrası mutasyonlar ayrı senkronizasyon gerektirir
  • Kullanım — ağır kaynaklar, UI bileşenleri, singleton hizmetleri, yapılandırmalar
  • Sınırlamalar — let, hesaplanmış özellikler, geçersiz kılma veya let örnekli yapılarda kullanılamaz
  • Optimizasyon — seyrek kullanılan özellikler için başlatma süresini ve bellek tüketimini azaltır

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.

Projeyi tartış

Ayrıca okuyun