Swift-də Lazy Property: nədir, tənbəl inisializasiyanın sintaksisi

Müəllif: IT Sectr Dərc olunub: 2026-06-20 Oxuma vaxtı: 10 dəq

Lazy Property Swift-də gecikmiş inisializasiya mexanizmidir, bu zaman xassə obyektin yaradılması zamanı deyil, ona ilk müraciət anında hesablanır. Adi stored properties-dən fərqli olaraq, tənbəl dəyişənlər resurs tutumlu əməliyyatlar üçün işəsalma vaxtını və yaddaş istehlakını əhəmiyyətli dərəcədə azaltmağa imkan verir. Apple Developer Documentation (2026)-ya görə, tənbəl xassələr yalnız bir dəfə inisializasiya olunur və ilk girişdə thread-safe olur.

Əsas məqamlar

  • Lazy — xassə obyektin yaradılması zamanı deyil, ilk müraciətdə inisializasiya olunur
  • Yalnız var — lazy let üçün qadağandır, çünki sabit inisializasiyadan əvvəl məlum olmalıdır
  • Thread təhlükəsizliyi — tənbəl xassənin inisializasiyası sinxronlaşdırılır, lakin təkrar giriş — yox
  • Birdəfəlik — lazy dəqiq bir dəfə hesablanır, sonrakı müraciətlər saxlanmış dəyəri qaytarır
  • Optimizasiya — nadir istifadə olunan məlumatlar üçün işəsalma vaxtını və yaddaş istehlakını azaldır

Swift-də Lazy Property nədir?

Lazy Property — inisializasiyası ilk müraciətə qədər təxirə salınan stored property-dir. lazy açar sözü var bəyannaməsindən əvvəl kompilyatora obyektin yaradılması zamanı dəyəri hesablamamağı bildirir.

Standart halda bütün stored properties sinif və ya strukturun nümunəsinin yaradılması zamanı inisializasiya olunur. Xassə mürəkkəb hesablamalar, şəbəkədən yükləmə və ya fayl sistemi ilə iş tələb edirsə, lazy bu əməliyyatı məlumatların həqiqətən ehtiyac duyulduğu ana qədər təxirə salmağa imkan verir.

Swift by Sundell (2025)-ə görə, tənbəl xassələr iOS tətbiqlərində performans optimizasiyasının ən effektiv vasitələrindən biridir. Onlar ağır ilkin konfiqurasiyası olan proqramlarda, məsələn, qrafik redaktorlar və ya analitik panellərdə işəsalma vaxtını 20–40% azaltmağa imkan verir.

Tənbəl xassənin sintaksisi

Bəyannamə tənbəl xassə lazy açar sözünün var-dan əvvəl yazılmasını tələb edir. Dəyər closure və ya funksiya çağırışı vasitəsilə təyin edilir.

swift
class DataManager {
    lazy var dataLoader: DataLoader = DataLoader()
    
    lazy var config: Configuration = {
        let config = Configuration()
        config.loadDefaults()
        return config
    }()
}

Closure tənbəl xassə üçün yalnız bir dəfə hesablanır və sonrakı müraciətlərdə saxlanmış dəyəri qaytarır. Bu, çoxsaylı addımları olan mürəkkəb konfiqurasiya üçün xüsusilə əlverişlidir.

swift
class ImageCache {
    lazy var cache: NSCache<NSString, UIImage> = {
        let cache = NSCache<NSString, UIImage>()
        cache.countLimit = 100
        cache.totalCostLimit = 50 * 1024 * 1024
        return cache
    }()
}

Çoxsaylı tənbəl xassələr bir-birindən asılı olmayaraq inisializasiya olunur. İki tənbəl xassə closure-lar vasitəsilə bir-birinə istinad edərsə — Swift-in avtomatik həll edə bilmədiyi tsiklik asılılıq yaranır.

Tənbəl xassə nə zaman inisializasiya olunur

İnisializasiya anı — lazy-nin adi stored properties-dən əsas fərqidir. İnisializasiya xassənin ilk oxunması və ya yazılması zamanı baş verir, lakin daha əvvəl deyil.

İlk giriş (oxu və ya yazı)

İnisializasiya xassəyə ilk müraciətdə işə düşür, istər oxu, istərsə də yazı olsun. Bu ana qədər xassə üçün yaddaş ayrılmır — yalnız «inisializasiya olunmayıb» bayrağı saxlanılır.

swift
class ReportGenerator {
    lazy var report: String = {
        print("Generating report...")
        return "Annual report data"
    }()
}

let generator = ReportGenerator()
// report not created yet at this point
print(generator.report)  // "Generating report..."
print(generator.report)  // not regenerated on subsequent access

Miras alınarkən davranış

Tənbəl xassələr alt siniflərdə override edilmir. Sinif tənbəl xassə elan edərsə, alt sinif onu computed və ya stored property kimi fərqli davranışla əvəz edə bilməz.

Apple Swift Blog (2025)-a görə, bu məhdudiyyət lazy-nin override mödifikatoru deyil, yaddaş saxlanmasının tətbiq detalı olması ilə bağlıdır. Alt sinif yalnız tənbəl xassənin closure-da çağırdığı metodu override edə bilər.

Tənbəl xassələrin thread təhlükəsizliyi

İnisializasiya tənbəl xassənin Swift-də thread təhlükəsizdir: iki thread eyni vaxtda tənbəl xassəyə müraciət edərsə, inisializasiya yalnız bir dəfə yerinə yetirilir, ikinci thread onun tamamlanmasını gözləyir.

Lakin inisializasiyadan sonra sinxronizasiya aradan qaldırılır. Bu o deməkdir ki, çoxsaylı thread-lərdən eyni vaxtda oxumaq təhlükəsizdir, lakin bir thread lazy var-a yeni dəyər yazarkən digəri oxuyursa — data race yaranır.

Swift Evolution proposal SE-0254 (2025)-ə görə, tənbəl xassələrin sinxronizasiya mexanizmi aşağı səviyyədə objc_sync_enter/exit vasitəsilə həyata keçirilir. Bu, inisializasiyanın atomarlığını təmin edir, lakin sonrakı mutasiyaları yox. Dəyişkən lazy xassələri ilə təhlükəsiz iş üçün ayrıca sinxronizasiya mexanizmlərindən istifadə edin.

Praktik istifadə ssenariləri

Tənbəl xassələr Swift layihələrində performans optimizasiyası və kod arxitekturasının yaxşılaşdırılması üçün tətbiq olunur.

Ağır resurslar

Şəkillərin yüklənməsi, JSON-un parse edilməsi, verilənlər bazaları ilə iş — bütün bu əməliyyatlar lazy vasitəsilə məlumatların həqiqətən istifadəçiyə lazım olduğu ana qədər təxirə salına bilər.

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

Singleton asılılıqları

Xidmətlər və menecerlər tətbiq işə salınarkən dərhal lazım deyilsə, onları lazy olaraq elan etmək səmərəlidir. Bu, işəsalma vaxtını və yaddaş istehlakını azaldır.

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

Kodla UI komponentləri

İnterfeysin proqramlı şəkildə yaradılması zamanı (Storyboard olmadan) tənbəl xassələr UI elementlərinin inisializasiyasını init-i yükləmədən təşkil etməyə imkan verir.

Məhdudiyyətlər və tələlər

Birinci məhdudiyyət: lazy let ilə istifadə edilə bilməz. Sabit init tamamlanmazdan əvvəl inisializasiya olunmalıdır, bu da gecikmiş inisializasiya ideyasına ziddir.

İkinci məhdudiyyət: lazy computed properties üçün mövcud deyil. Computed properties dəyər saxlamır, lazy isə məhz gecikmiş inisializasiyaya malik stored property-dir.

Üçüncü məhdudiyyət: strukturlarda tənbəl xassələr mutasiya ilə bağlı problemlər yarada bilər. Tənbəl xassəyə malik struktur let olaraq elan edilərsə, xassəyə giriş mümkün deyil, çünki inisializasiya strukturun mutasiyasını tələb edir.

Dördüncü: tənbəl xassələr inisializasiya zamanı willSet/didSet-i çağırmır. Yalnız sonrakı dəyişikliklərdə, xassə var olaraq elan edildikdə.

Stack Overflow (2025)-ə görə, lazy ilə bağlı sualların təxminən 15%-i lazy-nin let kontekstində istifadəsi və ya inisializasiyanın birdəfəliyini başa düşməməklə bağlıdır. Bu məhdudiyyətlər siniflərin layihələndirilməsi zamanı nəzərə alınmalıdır.

Tez-tez verilən suallar

Lazy let ilə istifadə edilə bilərmi?

Xeyr, lazy yalnız var üçün mövcuddur. let sabitləri init tamamlanmazdan əvvəl inisializasiya olunmalıdır, bu da gecikmiş inisializasiya ilə uyğun deyil.

Tənbəl xassə neçə dəfə hesablanır?

Dəqiq bir dəfə. İlk müraciətdə xassə inisializasiya olunur, bundan sonra təkrar hesablamadan saxlanmış dəyəri qaytarır.

Tənbəl xassə çoxthreadli mühitdə təhlükəsizdirmi?

İnisializasiya thread təhlükəsizdir — iki thread xassəni iki dəfə inisializasiya etmir. Lakin sonrakı mutasiyalar avtomatik sinxronlaşdırılmır.

Tənbəl xassəni alt sinifdə override etmək olarmı?

Xeyr, tənbəl xassələr override edilmir. Alt sinif yalnız closure daxilindəki məntiqi dəyişə bilər, lakin tənbəl inisializasiyanın özünü yox.

Lazy-nin computed property-dən fərqi nədir?

Lazy bir dəfə hesablanan və dəyər saxlayan stored property-dir. Computed property hər müraciətdə hesablanır və dəyər saxlamır.

Nəticə

  • Lazy Property — ilk girişdə yerinə yetirilən gecikmiş inisializasiya mexanizmi
  • Yalnız var — lazy let ilə uyğun deyil, çünki sabit dərhal inisializasiya tələb edir
  • Birdəfəlik — inisializasiya bir dəfə yerinə yetirilir, sonrakı müraciətlər keşlənmiş dəyərdən istifadə edir
  • Thread təhlükəsizliyi — inisializasiya sinxronlaşdırılır, lakin inisializasiyadan sonrakı mutasiyalar ayrıca sinxronizasiya tələb edir
  • Tətbiq — ağır resurslar, UI komponentləri, singleton xidmətlər, konfiqurasiyalar
  • Məhdudiyyətlər — let-də, computed properties-də, override-də və let-instansiyalı strukturlarda mümkün deyil
  • Optimizasiya — nadir istifadə olunan xassələr üçün işəsalma vaxtını və yaddaş istehlakını azaldır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun