ProgrammatieiOS ontwikkelaar

Wat zijn de belangrijkste verschillen tussen lazy properties in Swift? Wanneer moet je lazy gebruiken, welke bijzonderheden en valkuilen zijn er bij de initialisatie, en hoe kun je typische problemen vermijden?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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).
  • Binnen structuren werken lazy properties niet als de structuur zelf immutable is.
  • Als er via een andere thread naar wordt gezet — niet thread-safe. Gelijktijdige toegang tot lazy properties vanuit verschillende threads moet worden vermeden.
  • Bij het kopiëren van een klasse-object, wordt de lazy waarde apart voor elke instantie gecachet.

Misleidende vraag.

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"

Voorbeelden van echte fouten door gebrek aan kennis over de nuances van het onderwerp.


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.