Lazy Property Swift-ben egy halasztott inicializálási mechanizmus, amelynél a tulajdonság az első hozzáférés pillanatában kerül kiszámításra, nem az objektum létrehozásakor. A szokásos stored properties-től eltérően a lusta változók lehetővé teszik az indítási idő és a memóriahasználat jelentős csökkentését erőforrás-igényes műveleteknél. Az Apple Developer Documentation (2026) szerint a lusta tulajdonságok garantáltan csak egyszer inicializálódnak és az első hozzáféréskor thread-safe-ek.
Főbb pontok
Lazy Property egy stored property, amelynek inicializálása az első hozzáférésig halasztódik. A lazy kulcsszó a var deklaráció előtt jelzi a fordítónak, hogy ne számítsa ki az értéket az objektum létrehozásakor.
Alapértelmezett esetben az összes stored property inicializálódik az osztály vagy struktúra példányának létrehozásakor. Ha egy tulajdonság összetett számításokat, hálózati betöltést vagy fájlrendszerrel való munkát igényel, a lazy lehetővé teszi a művelet halasztását addig, amíg az adatokra valóban szükség van.
A Swift by Sundell (2025) szerint a lusta tulajdonságok az egyik leghatékonyabb teljesítményoptimalizálási eszköz az iOS alkalmazásokban. Lehetővé teszik az indítási idő 20–40%-os csökkentését a nehéz kezdeti beállításokkal rendelkező alkalmazásokban, mint például grafikus szerkesztők vagy analitikai irányítópultok.
Deklaráció a lusta tulajdonság a lazy kulcsszót igényli a var előtt. Az érték egy closure vagy függvényhívás segítségével kerül beállításra.
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
A closure a lusta tulajdonsághoz csak egyszer kerül kiszámításra, és a későbbi hozzáféréseknél a tárolt értéket adja vissza. Ez különösen kényelmes több lépésből álló összetett konfigurációhoz.
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
Több lusta tulajdonság egymástól függetlenül inicializálódik. Ha két lusta tulajdonság closure-ökön keresztül hivatkozik egymásra — ciklikus függőség alakul ki, amelyet a Swift nem tud automatikusan feloldani.
Az inicializálás pillanata a legfontosabb különbség a lazy és a szokásos stored properties között. Az inicializálás a tulajdonság első olvasásakor vagy írásakor történik, de nem korábban.
Az inicializálás a tulajdonság első hozzáférésénél indul el, legyen az olvasás vagy írás. Eddig a pillanatig a memória nincs lefoglalva a tulajdonsághoz — csak egy 'nincs inicializálva' jelző van tárolva.
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
A lusta tulajdonságok nem írhatók felül alosztályokban. Ha egy osztály lusta tulajdonságot deklarál, a gyermekosztály nem írhatja felül azt computed vagy stored propertyként eltérő viselkedéssel.
Az Apple Swift Blog (2025) szerint ez a korlátozás annak köszönhető, hogy a lazy nem felülírási módosító, hanem a tárolás implementációs részlete. Az alosztály csak azt a metódust írhatja felül, amelyet a lusta tulajdonság a closure-ben meghív.
A lusta tulajdonság inicializálása thread-safe Swift-ben: ha két szál egyszerre fér hozzá egy lusta tulajdonsághoz, az inicializálás csak egyszer történik meg, a második szál blokkolva van annak befejezéséig.
Azonban inicializálás után a szinkronizáció megszűnik. Ez azt jelenti, hogy a több szálból történő egyidejű olvasás biztonságos, de ha az egyik szál új értéket ír a lazy var-ba, míg egy másik olvas — data race alakul ki.
A Swift Evolution proposal SE-0254 (2025) szerint a lusta tulajdonságok szinkronizációs mechanizmusa alacsony szinten objc_sync_enter/exit segítségével van implementálva. Ez garantálja az inicializálás atomicitását, de a későbbi mutációkét nem. A mutable lusta tulajdonságokkal való biztonságos munkához külön szinkronizációs mechanizmusokat használjon.
A lusta tulajdonságokat Swift projektekben használják a teljesítmény optimalizálására és a kód architektúrájának javítására.
Képek betöltése, JSON feldolgozása, adatbázisokkal való munka — mindezek a műveletek lazy segítségével halaszthatók addig, amíg az adatokra valóban szüksége van a felhasználónak.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
Azok a szolgáltatások és menedzserek, amelyekre nincs azonnal szükség az alkalmazás indításakor, hatékonyan deklarálhatók lazy-ként. Ez csökkenti az indítási időt és a memóriahasználatot.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
A felület programozott létrehozásakor (Storyboard nélkül) a lusta tulajdonságok lehetővé teszik az UI elemek inicializálásának megszervezését anélkül, hogy eltömnék az init-et.
Első korlátozás: a lazy nem használható let-tel. A konstansnak az init befejezése előtt inicializálódnia kell, ami ellentmond a halasztott inicializálás elvének.
Második korlátozás: a lazy nem érhető el computed properties-hez. A computed properties nem tárol értéket, míg a lazy pontosan egy stored property halasztott inicializálással.
Harmadik korlátozás: a lusta tulajdonságok struktúrákban mutációs problémákat okozhatnak. Ha egy lusta tulajdonsággal rendelkező struktúra let-ként van deklarálva, a tulajdonsághoz való hozzáférés lehetetlen, mivel az inicializálás a struktúra mutációját igényli.
Negyedik: a lusta tulajdonságok nem váltják ki a willSet/didSet-et inicializáláskor. Csak a későbbi változtatásoknál, ha a tulajdonság var-ként van deklarálva.
A Stack Overflow (2025) szerint a lazy-val kapcsolatos kérdések körülbelül 15%-a a lazy let kontextusban való használatára vagy az inicializálás egyszeriségének félreértésére vezethető vissza. Ezeket a korlátozásokat fontos figyelembe venni az osztályok tervezésekor.
Gyakran ismételt kérdések
Nem, a lazy csak var számára érhető el. A let konstansoknak az init befejezése előtt inicializálódniuk kell, ami összeférhetetlen a halasztott inicializálással.
Pontosan egyszer. Az első hozzáféréskor a tulajdonság inicializálódik, ezután a tárolt értéket adja vissza újraszámítás nélkül.
Az inicializálás thread-safe — két szál nem inicializálja kétszer a tulajdonságot. Azonban a későbbi mutációk nem szinkronizálódnak automatikusan.
Nem, a lusta tulajdonságok nem írhatók felül. Az alosztály csak a closure-en belüli logikát változtathatja meg, de magát a lusta inicializálás tényét nem.
A Lazy egy stored property, amely egyszer kerül kiszámításra és tárolja az értéket. A computed property minden hozzáféréskor kiszámításra kerül és nem tárol értéket.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is