ProgrammatieiOS ontwikkelaar

Leg de verschillen uit tussen value types en reference types in Swift. Wanneer moet je elk van hen gebruiken?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In Swift zijn er twee hoofdtypen gegevens: value types (waarde types) en reference types (referentietypes).

  • Value types. Dit omvat structuren (struct), enumeraties (enum) en basistypen zoals Int, Double, Bool. Bij overdracht of toewijzing wordt de waarde gekopieerd, wat betekent dat wijzigingen aan de kopie de originele waarde niet beïnvloeden.
  • Reference types. Dit zijn klassen (class) en gerelateerde types. Bij overdracht wordt niet het object zelf gekopieerd, maar een verwijzing ernaar, waardoor wijzigingen via de ene verwijzing ook zichtbaar zijn via andere.

Wanneer te gebruiken:

  • Gebruik value types als je wilt dat gegevens onafhankelijke kopieën zijn (bijvoorbeeld CGPoint, CGSize, modellen die geen status mogen delen).
  • Reference types zijn geschikt als er een statusdeling tussen objecten nodig is (bijvoorbeeld managers, controllers, services).

Voorbeeld:

struct Point { var x: Int var y: Int } class Person { var name: String init(name: String) { self.name = name } } var p1 = Point(x: 0, y: 0) var p2 = p1 p2.x = 10 // p1.x blijft gelijk aan 0 var person1 = Person(name: "Alex") var person2 = person1 person2.name = "Sam" // person1.name wordt ook "Sam"

Vragend: Hoe verschilt let voor struct en class? Is een instantie van class, gemaakt met let, volledig onveranderlijk?**

Antwoord:

Voor value types (struct) maakt let het object en zijn eigenschappen onveranderlijk.

Voor reference types (class) verbiedt let het opnieuw toewijzen van de verwijzing, maar beschermt het de eigenschappen van het object niet. Deze kunnen worden gewijzigd, tenzij ze als let binnen de klasse zijn gedeclareerd.

Voorbeeld:

class Box { var value: Int init(value: Int) { self.value = value } } let box = Box(value: 10) box.value = 20 // OK! // box = Box(value: 30) // Fout: kan box niet opnieuw toewijzen

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


Verhaal

In de betalingsapplicatie werd het transactie-model gedefinieerd als een klasse, terwijl er geen status zou moeten zijn. Er ontstond een bug: bij gelijktijdig werken met een lijst van transacties was er onvoorspelbare bewerking van gegevens in verschillende delen van de interface. Het werd besloten om modellen naar struct te verplaatsen, zodat elke component met zijn eigen kopie werkte.


Verhaal

In het project werden de gebruikersinstellingen in een klasse opgeslagen, in de veronderstelling dat waarden bij overdracht worden gekopieerd. Bij het wijzigen van gegevens beïnvloedde één scherm per ongeluk een ander, omdat beiden met dezelfde verwijzing naar het object werkten.


Verhaal

In de serialisatiemodule werden de gegevensmodellen als reference type gedeclareerd, waardoor wijzigingen leidden tot beschadiging van de status in de cache. Na de vervanging door value types verdween het probleem: de gegevens werden onafhankelijk bij elke bewerking.