ProgrammierungiOS Entwickler

Erklären Sie die Unterschiede zwischen value types und reference types in Swift. Wann sollte man welche verwenden?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In Swift gibt es zwei Hauptdatentypen: value types (Werttypen) und reference types (Referenztypen).

  • Value types. Dazu gehören Strukturen (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.
  • Reference types. Dies sind Klassen (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:

  • Verwenden Sie Werttypen, wenn Sie möchten, dass die Daten unabhängige Kopien sind (z.B. CGPoint, CGSize, Modelle, die ihren Zustand nicht teilen sollten).
  • Referenztypen eignen sich, wenn eine gemeinsame Zustandsverwaltung zwischen Objekten erforderlich ist (z.B. Manager, Controller, Dienste).

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"

Fangfrage.

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

Beispiele für reale Fehler aufgrund fehlenden Wissens über die Feinheiten des Themas.


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.