ProgrammatieSenior iOS ontwikkelaar

Hoe werken static en class properties in Swift, wat zijn de valkuilen bij het gebruik ervan en hoe implementeer je thread-safe statics?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Static en class properties zijn eigenschappen die aan het type toebehoren in plaats van aan een instantie. Historisch zijn ze ontstaan om informatie op te slaan die gemeenschappelijk is voor alle instanties (bijvoorbeeld tellers, configuraties, fabrieken). In Swift kan static worden gebruikt in alle typen (class, struct, enum), terwijl class alleen in klassen kan worden gebruikt en alleen voor berekende eigenschappen, wat de mogelijkheid biedt tot overschrijven in afgeleiden klassen.

Probleem: Onjuist gebruik van statische eigenschappen kan leiden tot race-voorwaarden en fouten bij toegang vanuit verschillende threads. Het is ook gemakkelijk om static en class te verwarren en het verkeerde mechanisme te kiezen voor overschrijving in afgeleiden klassen.

Oplossing:

  • Gebruik static voor onveranderlijke of expliciet thread-veilige eigenschappen.
  • Voor het erven en overschrijven — definieer class property.
  • Voor thread safety — sla data op in een privé statisch magazijn en benader ze alleen via gesynchroniseerde logica (bijvoorbeeld via DispatchQueue).

Voorbeeld code:

class Counter { static var count = 0 static let queue = DispatchQueue(label: "counter.queue") static func increment() { queue.sync { count += 1 } } class var typeDescription: String { return "Generic Counter" } } class NamedCounter: Counter { override class var typeDescription: String { return "Named Counter" } }

Belangrijkste kenmerken:

  • static kan niet worden overschreven, class var kan dat wel.
  • static werkt voor alle typen, class alleen voor klassen.
  • Statische eigenschappen — één kopie per type, toegankelijk vanuit elke plek in de code.

Vragen met een valkuil.

Vraag 1: Kan je een static let property declareren als een berekend (computed) eigenschap met get?

Ja, een static property kan zowel stored als computed zijn. Voor let eigenschappen is dit meestal een constante, maar een static var kan heel goed berekend zijn:

struct Math { static var pi: Double { return 3.1415926 } }

Vraag 2: Zijn static var thread-safe per standaard?

Nee, als static var wordt gewijzigd vanuit verschillende threads, kunnen er race-voorwaarden optreden. read/write moet handmatig worden gesynchroniseerd.

Vraag 3: Kan je class var gebruiken voor stored eigenschappen?

Nee, class var moet altijd een berekende eigenschap zijn (property with get/optional set), stored eigenschappen zijn alleen toegestaan voor static.

Typische fouten en anti-patronen

  • Laat static var onveranderd in een multi-threaded omgeving.
  • Probeer een stored class var te declareren.
  • Verwissel static en class, kies niet het juiste mechanisme voor overerving.

Voorbeeld uit het echte leven

Negatief geval

In de applicatie werd de inlog teller van de gebruiker opgeslagen in static var en werd deze geïnkremmenteerd vanuit verschillende threads zonder synchronisatie.

Voordelen:

  • Eenvoudig te implementeren.

Nadelen:

  • Uiteindelijk gaf de teller soms onjuiste waarden, wat het debuggen en bugtracking bemoeilijkte.

Positief geval

Voor een globaal configuratie object werd static let gebruikt en was de toegang er alleen om te lezen of met gebruik van DispatchQueue voor schrijven.

Voordelen:

  • Geen racen en voorspelbaar gedrag.
  • Ondersteunt thread-safe.

Nadelen:

  • De omvang van de code nam iets toe vanwege de omhulling met de queue.