Lazy Property în Swift este un mecanism de inițializare întârziată, în care proprietatea este calculată în momentul primei accesări, nu la crearea obiectului. Spre deosebire de stored properties obișnuite, variabilele leneșe permit reducerea semnificativă a timpului de pornire și a consumului de memorie pentru operațiuni consumatoare de resurse. Conform Apple Developer Documentation (2026), proprietățile leneșe sunt garantat inițializate o singură dată și sunt thread-safe la prima accesare.
Principalele puncte
Lazy Property este o stored property a cărei inițializare este amânată până la prima accesare. Cuvântul cheie lazy înaintea declarației var indică compilatorului să nu calculeze valoarea la crearea obiectului.
În cazul standard, toate stored properties sunt inițializate la crearea instanței unei clase sau structuri. Dacă proprietatea necesită calcule complexe, încărcare din rețea sau lucru cu sistemul de fișiere, lazy permite amânarea acestei operațiuni până când datele sunt cu adevărat necesare.
Conform Swift by Sundell (2025), proprietățile leneșe sunt unul dintre cele mai eficiente instrumente de optimizare a performanței în aplicațiile iOS. Ele permit reducerea timpului de pornire cu 20–40% în aplicațiile cu configurare inițială grea, cum ar fi editorii grafici sau panourile analitice.
Declararea unei proprietăți leneșe necesită cuvântul cheie lazy înainte de var. Valoarea este stabilită printr-un closure sau apel de funcție.
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
Closure-ul pentru proprietatea leneșă se calculează o singură dată și returnează valoarea salvată la accesările ulterioare. Acest lucru este deosebit de convenabil pentru configurarea complexă cu mai mulți pași.
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
Mai multe proprietăți leneșe sunt inițializate independent una de cealaltă. Dacă două proprietăți leneșe se referă una la alta prin closure-uri — apare o dependență ciclică pe care Swift nu o poate rezolva automat.
Momentul inițializării este diferența cheie între lazy și stored properties obișnuite. Inițializarea are loc la prima citire sau scriere a proprietății, dar nu mai devreme.
Inițializarea este declanșată la prima accesare a proprietății, fie citire, fie scriere. Până în acest moment, memoria pentru proprietate nu este alocată — este stocat doar un indicator „neinițializat”.
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
Proprietățile leneșe nu sunt suprascrise în subclase. Dacă o clasă declară o proprietate leneșă, clasa copil nu o poate suprascrie ca computed sau stored property cu alt comportament.
Conform Apple Swift Blog (2025), această limitare se datorează faptului că lazy nu este un modificator de suprascriere, ci un detaliu de implementare a stocării. Subclasa poate doar suprascrie metoda pe care proprietatea leneșă o apelează în closure.
Inițializarea proprietății leneșe este thread-safe în Swift: dacă două fire accesează simultan o proprietate leneșă, inițializarea se execută o singură dată, al doilea fir fiind blocat până la finalizarea acesteia.
Totuși, după inițializare, sincronizarea este eliminată. Aceasta înseamnă că citirea simultană din mai multe fire este sigură, dar dacă un fir scrie o nouă valoare în lazy var, iar altul citește — apare o data race.
Conform Swift Evolution proposal SE-0254 (2025), mecanismul de sincronizare a proprietăților leneșe este implementat prin objc_sync_enter/exit la nivel scăzut. Aceasta garantează atomicitatea inițializării, dar nu și a mutațiilor ulterioare. Pentru lucrul sigur cu proprietăți mutable lazy, utilizați mecanisme separate de sincronizare.
Proprietățile leneșe sunt utilizate în proiectele Swift pentru optimizarea performanței și îmbunătățirea arhitecturii codului.
Încărcarea imaginilor, parsarea JSON, lucrul cu baze de date — toate aceste operațiuni pot fi amânate cu lazy până când datele sunt cu adevărat necesare utilizatorului.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
Serviciile și managerii care nu sunt necesari imediat la pornirea aplicației pot fi declarate eficient ca lazy. Aceasta reduce timpul de pornire și consumul de memorie.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
La crearea programatică a interfeței (fără Storyboard), proprietățile leneșe permit organizarea inițializării elementelor UI fără a aglomera init-ul.
Prima limitare: lazy nu poate fi folosit cu let. Constanta trebuie inițializată înainte de finalizarea init, ceea ce contrazice însăși ideea de inițializare întârziată.
A doua limitare: lazy nu este disponibil pentru computed properties. Computed properties nu stochează valoarea, iar lazy este exact o stored property cu inițializare întârziată.
A treia limitare: proprietățile leneșe în structuri pot cauza probleme cu mutația. Dacă o structură cu o proprietate leneșă este declarată ca let, accesul la proprietate este imposibil, deoarece inițializarea necesită mutația structurii.
A patra: proprietățile leneșe nu declanșează willSet/didSet la inițializare. Doar la modificările ulterioare, dacă proprietatea este declarată ca var.
Conform Stack Overflow (2025), aproximativ 15% din întrebările despre lazy sunt legate de încercarea de a folosi lazy în context let sau de neînțelegerea unicității inițializării. Aceste limitări sunt importante de luat în considerare la proiectarea claselor.
Întrebări frecvente
Nu, lazy este disponibil doar pentru var. Constantele let trebuie inițializate înainte de finalizarea init, ceea ce este incompatibil cu inițializarea întârziată.
Exact o dată. La prima accesare, proprietatea este inițializată, după care returnează valoarea salvată fără recalculare.
Inițializarea este thread-safe — două fire nu inițializează proprietatea de două ori. Cu toate acestea, mutațiile ulterioare nu sunt sincronizate automat.
Nu, proprietățile leneșe nu se suprascriu. Subclasa poate schimba doar logica din interiorul closure-ului, dar nu însuși faptul inițializării leneșe.
Lazy este o stored property care se calculează o dată și stochează valoarea. Computed property se calculează la fiecare accesare și nu stochează valoarea.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și