In Swift gibt es zwei Hauptdatentypen: value types (Werttypen) und reference types (Referenztypen).
struct), Aufzählungen (enum) und grundlegende Typen wie Int, Double, Bool. Bei der Übergabe oder Zuweisung wird der Wert kopiert, d.h. Änderungen an der Kopie beeinflussen das Original nicht.class) und verwandte Typen. Bei der Übergabe wird nicht das Objekt selbst, sondern ein Verweis darauf kopiert, daher sind Änderungen über einen Verweis auch über andere sichtbar.Wann verwenden:
CGPoint, CGSize, Modelle, die ihren Zustand nicht teilen sollten).Beispiel:
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 bleibt 0 var person1 = Person(name: "Alex") var person2 = person1 person2.name = "Sam" // person1.name wird auch "Sam"
Was ist der Unterschied zwischen let für struct und class? Ist eine Instanz von class, die mit let erstellt wurde, vollständig unveränderlich?
Antwort:
Bei Werttypen (struct) macht let das Objekt und seine Eigenschaften unveränderlich.
Bei Referenztypen (class) verhindert let, dass der Verweis neu zugewiesen wird, schützt jedoch nicht die Eigenschaften des Objekts. Diese können geändert werden, sofern sie nicht als let innerhalb der Klasse deklariert sind.
Beispiel:
class Box { var value: Int init(value: Int) { self.value = value } } let box = Box(value: 10) box.value = 20 // OK! // box = Box(value: 30) // Fehler: box kann nicht neu zugewiesen werden
Geschichte
In einer Zahlungsanwendung wurde das Transaktionsmodell als Klasse definiert, obwohl es keinen Zustand geben sollte. Es gab einen Bug: Bei gleichzeitiger Bearbeitung einer Transaktionsliste kam es zu unvorhersehbaren Änderungen in verschiedenen Teilen der Benutzeroberfläche. Es wurde beschlossen, die Modelle in struct umzuwandeln, damit jede Komponente mit ihrer eigenen Kopie arbeitete.
Geschichte
In einem Projekt wurden die Benutzereinstellungen in einer Klasse gespeichert, in der Annahme, dass die Werte bei der Übergabe kopiert werden. Bei der Änderung von Daten beeinflusste ein Bildschirm unbeabsichtigt einen anderen, da beide mit demselben Verweis auf das Objekt arbeiteten.
Geschichte
Im Serialisierungsmodul wurden die Datenmodelle als Referenztyp deklariert, was dazu führte, dass Änderungen den Zustand im Cache beschädigten. Nach Umstellung auf Werttypen verschwand das Problem: Daten wurden bei jeder Operation unabhängig.