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 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.
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.
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.
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.
İ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.
İ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.
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
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.
İ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.
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.
Şə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.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
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.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
İ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.
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
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.
Dəqiq bir dəfə. İlk müraciətdə xassə inisializasiya olunur, bundan sonra təkrar hesablamadan saxlanmış dəyəri qaytarır.
İnisializasiya thread təhlükəsizdir — iki thread xassəni iki dəfə inisializasiya etmir. Lakin sonrakı mutasiyalar avtomatik sinxronlaşdırılmır.
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 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ə
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.
Həm də oxuyun