Lazy Property у Swift-у је механизам одложене иницијализације при којем се својство израчунава у тренутку првог приступа, а не приликом креирања објекта. За разлику од обичних stored properties, лење променљиве омогућавају значајно смањење времена покретања и потрошње меморије за ресурсно захтевне операције. Према Apple Developer Documentation (2026), лења својства су гарантовано иницијализована само једном и thread-safe су при првом приступу.
Главне тачке
Lazy Property је stored property чија се иницијализација одлаже до првог приступа. Кључна реч lazy испред декларације var указује компајлеру да не израчунава вредност при креирању објекта.
У стандардном случају, све stored properties се иницијализују при креирању инстанце класе или структуре. Ако својство захтева сложена израчунавања, учитавање из мреже или рад са системом датотека, lazy омогућава одлагање ове операције док подаци заиста не буду потребни.
Према Swift by Sundell (2025), лења својства су један од најефикаснијих алата за оптимизацију перформанси у iOS апликацијама. Она омогућавају смањење времена покретања за 20–40% у апликацијама са тешким почетним подешавањем, попут графичких едитора или аналитичких контролних табли.
Декларација лењег својства захтева кључну реч lazy испред var. Вредност се поставља преко closure-а или позива функције.
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
Closure за лење својство се израчунава само једном и враћа сачувану вредност при накнадним приступима. Ово је посебно згодно за сложену конфигурацију са више корака.
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
Више лењих својстава се иницијализују независно једно од другог. Ако се два лења својства позивају једно на друго преко closure-а — настаје циклична зависност коју Swift не може аутоматски да реши.
Тренутак иницијализације је кључна разлика између lazy и обичних stored properties. Иницијализација се дешава при првом читању или писању својства, али не раније.
Иницијализација се покреће при првом приступу својству, било читање или писање. До овог тренутка меморија за својство није алоцирана — чува се само ознака „није иницијализовано”.
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
Лења својства се не преписују у подкласама. Ако класа декларише лење својство, подкласа га не може преписивати као computed или stored property са другачијим понашањем.
Према Apple Swift Blog (2025), ово ограничење је последица чињенице да lazy није модификатор преписивања, већ детаљ имплементације складиштења. Подкласа може само да препише метод који лење својство позива у closure-у.
Иницијализација лењег својства је thread-safe у Swift-у: ако две нити истовремено приступе лењем својству, иницијализација се извршава само једном, друга нит је блокирана до њеног завршетка.
Међутим, након иницијализације синхронизација се уклања. То значи да је истовремено читање из више нити безбедно, али ако једна нит упише нову вредност у lazy var, а друга чита — настаје data race.
Према Swift Evolution proposal SE-0254 (2025), механизам синхронизације лењих својстава је имплементиран преко objc_sync_enter/exit на ниском нивоу. Ово гарантује атомичност иницијализације, али не и накнадних мутација. За безбедан рад са mutable lazy својствима користите одвојене механизме синхронизације.
Лења својства се користе у Swift пројектима за оптимизацију перформанси и побољшање архитектуре кода.
Учитавање слика, парсирање JSON-а, рад са базама података — све ове операције могу бити одложене помоћу lazy док подаци заиста не буду потребни кориснику.
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
Сервиси и менаџери који нису потребни одмах при покретању апликације ефикасно се декларишу као lazy. Ово смањује време покретања и потрошњу меморије.
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
При програмирању интерфејса (без Storyboard-а), лења својства омогућавају организацију иницијализације UI елемената без загушeња init-а.
Прво ограничење: lazy се не може користити са let. Константа мора бити иницијализована пре завршетка init-а, што је у супротности са самом идејом одложене иницијализације.
Друго ограничење: lazy није доступно за computed properties. Computed properties не чувају вредност, а lazy је управо stored property са одложеном иницијализацијом.
Треће ограничење: лења својства у структурама могу изазвати проблеме са мутацијом. Ако је структура са лењим својством декларисана као let, приступ својству је немогућ, јер иницијализација захтева мутацију структуре.
Четврто: лења својства не позивају willSet/didSet при иницијализацији. Само при накнадним променама, ако је својство декларисано као var.
Према Stack Overflow (2025), око 15% питања о lazy односи се на покушај употребе lazy у let контексту или неразумевање једнократности иницијализације. Ова ограничења је важно узети у обзир при пројектовању класа.
Често постављана питања
Не, lazy је доступан само за var. Константе let морају бити иницијализоване пре завршетка init-а, што је некомпатибилно са одложеном иницијализацијом.
Тачно једном. При првом приступу својство се иницијализује, након чега враћа сачувану вредност без поновног израчунавања.
Иницијализација је thread-safe — две нити не иницијализују својство два пута. Међутим, накнадне мутације се не синхронизују аутоматски.
Не, лења својства се не преписују. Подкласа може променити само логику унутар closure-а, али не и саму чињеницу лење иницијализације.
Lazy је stored property које се израчунава једном и чува вредност. Computed property се израчунава при сваком приступу и не чува вредност.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође