In Swift zijn er twee hoofdtypen gegevens: value types (waarde types) en reference types (referentietypes).
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.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:
CGPoint, CGSize, modellen die geen status mogen delen).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"
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
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.