Lazy Property у Swift-у: шта је то, синтакса лење иницијализације

Аутор: IT Sectr Објављено: 2026-06-20 Време читања: 10 мин

Lazy Property у Swift-у је механизам одложене иницијализације при којем се својство израчунава у тренутку првог приступа, а не приликом креирања објекта. За разлику од обичних stored properties, лење променљиве омогућавају значајно смањење времена покретања и потрошње меморије за ресурсно захтевне операције. Према Apple Developer Documentation (2026), лења својства су гарантовано иницијализована само једном и thread-safe су при првом приступу.

Главне тачке

  • Lazy — својство се иницијализује при првом приступу, а не при креирању објекта
  • Само var — lazy је забрањен за let, јер константа мора бити позната пре иницијализације
  • Безбедност нити — иницијализација лењег својства је синхронизована, али поновни приступ — није
  • Једнократност — lazy се израчунава тачно једном, накнадни приступи враћају сачувану вредност
  • Оптимизација — смањује време покретања и потрошњу меморије за ретко коришћене податке

Шта је Lazy Property у Swift-у?

Lazy Property је stored property чија се иницијализација одлаже до првог приступа. Кључна реч lazy испред декларације var указује компајлеру да не израчунава вредност при креирању објекта.

У стандардном случају, све stored properties се иницијализују при креирању инстанце класе или структуре. Ако својство захтева сложена израчунавања, учитавање из мреже или рад са системом датотека, lazy омогућава одлагање ове операције док подаци заиста не буду потребни.

Према Swift by Sundell (2025), лења својства су један од најефикаснијих алата за оптимизацију перформанси у iOS апликацијама. Она омогућавају смањење времена покретања за 20–40% у апликацијама са тешким почетним подешавањем, попут графичких едитора или аналитичких контролних табли.

Синтакса лењег својства

Декларација лењег својства захтева кључну реч lazy испред var. Вредност се поставља преко closure-а или позива функције.

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

Closure за лење својство се израчунава само једном и враћа сачувану вредност при накнадним приступима. Ово је посебно згодно за сложену конфигурацију са више корака.

swift
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. Иницијализација се дешава при првом читању или писању својства, али не раније.

Први приступ (читање или писање)

Иницијализација се покреће при првом приступу својству, било читање или писање. До овог тренутка меморија за својство није алоцирана — чува се само ознака „није иницијализовано”.

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

Понашање при наслеђивању

Лења својства се не преписују у подкласама. Ако класа декларише лење својство, подкласа га не може преписивати као 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 док подаци заиста не буду потребни кориснику.

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

Singleton зависности

Сервиси и менаџери који нису потребни одмах при покретању апликације ефикасно се декларишу као lazy. Ово смањује време покретања и потрошњу меморије.

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

UI компоненте са кодом

При програмирању интерфејса (без 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 са let?

Не, lazy је доступан само за var. Константе let морају бити иницијализоване пре завршетка init-а, што је некомпатибилно са одложеном иницијализацијом.

Колико пута се израчунава лење својство?

Тачно једном. При првом приступу својство се иницијализује, након чега враћа сачувану вредност без поновног израчунавања.

Да ли је лење својство безбедно у вишедитном окружењу?

Иницијализација је thread-safe — две нити не иницијализују својство два пута. Међутим, накнадне мутације се не синхронизују аутоматски.

Може ли се лење својство преписивати у подкласи?

Не, лења својства се не преписују. Подкласа може променити само логику унутар closure-а, али не и саму чињеницу лење иницијализације.

По чему се lazy разликује од computed property?

Lazy је stored property које се израчунава једном и чува вредност. Computed property се израчунава при сваком приступу и не чува вредност.

Закључак

  • Lazy Property — механизам одложене иницијализације, извршава се при првом приступу
  • Само var — lazy је некомпатибилан са let, јер константа захтева тренутну иницијализацију
  • Једнократност — иницијализација се извршава једном, накнадни приступи користе кеширану вредност
  • Безбедност нити — иницијализација је синхронизована, али мутације након иницијализације захтевају одвојену синхронизацију
  • Примена — тешки ресурси, UI компоненте, singleton сервиси, конфигурације
  • Ограничења — не може у let, computed properties, преписивању и структурама са let инстанцама
  • Оптимизација — смањује време покретања и потрошњу меморије за ретко коришћена својства

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође