lazy properties in Swift worden pas berekend bij de eerste toegang tot hen. Dit wordt vaak gebruikt voor dure objecten (bijvoorbeeld zware berekeningen, netwerkdownloads) die niet onmiddellijk nodig zijn. Ze worden gedeclareerd met het sleutelwoord lazy:
class DataFetcher { lazy var data: Data = self.loadData() func loadData() -> Data { /* … */ } }
Bijzonderheden en nuances:
lazy properties zijn alleen toegestaan voor variabelen (var), niet voor constanten (let).lazy properties niet als de structuur zelf immutable is.lazy waarde apart voor elke instantie gecachet.Vraag: "Wordt de waarde voor de lazy property aangemaakt bij de initialisatie van de klasse-instantie?"
Antwoord: Nee, de waarde wordt pas berekend bij de eerste toegang tot de property, niet bij de initialisatie.
class Expensive { init() { print("init") } } class Example { lazy var heavy = Expensive() } let foo = Example() // geeft niets weer _ = foo.heavy // nu "init"
Verhaal
In een project op twee platforms werd een lazy array (lazy var) gebruikt voor het opslaan van een afbeeldingscache. Bij gelijktijdige toegang vanuit meerdere threads ontstonden er race conditions; lazy var werd omhuld met mutexen — maar ze vergaten over lazy, wat leidde tot een crash van de applicatie.
Verhaal
Een jonge ontwikkelaar probeerde lazy let te declareren om een zware berekening te cachen. De code compileerde niet omdat lazy alleen is toegestaan voor var: ze moesten de architectuur heroverwegen.
Verhaal
Een ontwikkelaar declareerde een lazy property met een self-capturing binnen een closure tijdens initialisatie. Dit leidde tot een cyclische referentie — het object werd niet gedeïnitieerd, zelfs niet na het verlaten van alle schermen.