Aus dem Apple-Buch "Einer der wichtigsten Unterschiede zwischen Strukturen und Klassen besteht darin, dass Strukturen immer kopiert werden, wenn sie in Ihrem Code herumgereicht werden, Klassen jedoch als Referenz übergeben werden."
Kann mir jemand helfen zu verstehen, was das bedeutet? Klassen und Strukturen scheinen mir gleich zu sein.
void my_func(int a)
vsvoid my_func(int &a)
. Dies ist eine sehr grundlegende Frage der Programmierung. Lesen Sie mehr: stackoverflow.com/questions/373419/…Antworten:
Hier ist ein Beispiel mit einem
class
. Beachten Sie, dass beim Ändern des Namens die Instanz, auf die beide Variablen verweisen, aktualisiert wird.Bob
ist jetztSue
überall, woBob
jemals verwiesen wurde.Und jetzt mit a sehen
struct
wir, dass die Werte kopiert werden und jede Variable ihre eigenen Werte behält. Wenn wir den Namen auf setzenSue
, wird dieBob
Struktur inaStruct
nicht geändert.Für die Darstellung einer komplexen staatlichen Einheit ist a
class
also fantastisch. Für Werte, die lediglich eine Messung oder Teile verwandter Daten sind,struct
ist a jedoch sinnvoller, damit Sie sie einfach kopieren und damit berechnen oder die Werte ändern können, ohne Nebenwirkungen befürchten zu müssen.quelle
aStruct and bStruct are two structs with the same value!
verwirrt mich, da die Werte der Variablen innerhalb der Struktur unterschiedlich sind.aStruct
undbStruct
haben identische Werte. Sie haben beide ein einzigesname
Feld, auf das gesetzt wird"Bob"
. Aber es sind zwei verschiedene Strukturen. Dies wird in der nächsten Zeile bewiesen, wenn Sie den Namen einer der Strukturen ändern können und die andere unverändert bleibt.Sowohl Klasse als auch Struktur können:
Nur die Klasse kann:
quelle
struct
sind Werttypen. Wenn Sie die Instanz der Struktur in eine andere Variable kopieren, wird sie nur in die Variable kopiert.Beispiel für Werttyp
Klassen sind Referenztypen. Wenn Sie einer Variablen eine Instanz der Klasse zuweisen, enthält diese nur den Verweis auf die Instanz und nicht die Kopie .
quelle
Die obigen Antworten sind korrekt. Ich hoffe, meine Antwort hilft jemandem, der die obigen Antworten nicht versteht.
Nun, in Swift gibt es zwei Arten von Objekten
Hauptunterschied zwischen ihnen ist
Zum Beispiel hier Code, um gut zu verstehen.
Dies war der Hauptunterschied, aber wir haben auch Unterunterschiede.
Klasse
Struct
quelle
Diese Frage scheint doppelt zu sein, aber unabhängig davon würde Folgendes den größten Teil des Anwendungsfalls beantworten:
Einer der wichtigsten Unterschiede zwischen Strukturen und Klassen besteht darin, dass Strukturen Werttypen sind und immer kopiert werden, wenn sie in Ihrem Code weitergegeben werden. Klassen sind Referenztypen und werden als Referenz übergeben.
Klassen haben auch Vererbung, die es einer Klasse ermöglicht, die Eigenschaften einer anderen zu erben.
Struktureigenschaften werden auf dem Stapel gespeichert, und Klasseninstanzen werden auf dem Heap gespeichert. Daher ist der Stapel manchmal drastisch schneller als eine Klasse.
Struct erhält automatisch einen Standardinitialisierer, während wir in Class initialisieren müssen.
Struct ist zu jedem Zeitpunkt threadsicher oder singleton.
Um den Unterschied zwischen Strukturen und Klassen zusammenzufassen, ist es außerdem erforderlich, den Unterschied zwischen Wert- und Referenztypen zu verstehen.
// sampleplayground.playground
Ausgabe:
quelle
Wenn Sie weiter im Apple-Handbuch nachsehen, sehen Sie diesen Abschnitt: „Strukturen und Aufzählungen sind Werttypen“.
In diesem Abschnitt sehen Sie Folgendes:
Dies ist der größte Unterschied zwischen Strukturen und Klassen. Strukturen werden kopiert und Klassen referenziert.
quelle
Normalerweise (in den meisten Programmiersprachen) sind Objekte Datenblöcke, die auf einem Heap gespeichert sind, und dann enthält eine Referenz (normalerweise ein Zeiger) auf diese Blöcke eine
name
Verwendung, um auf diese Datenblöcke zuzugreifen. Dieser Mechanismus ermöglicht die Freigabe von Objekten im Heap, indem der Wert ihrer Referenzen (Zeiger) kopiert wird. Dies ist bei grundlegenden Datentypen wie Integer nicht der Fall, und das liegt daran, dass der zum Erstellen einer Referenz erforderliche Speicher fast dem Objekt entspricht (in diesem Fall ein ganzzahliger Wert). Daher werden sie bei großen Objekten als Werte und nicht als Referenz übergeben.Swift verwendet struct, um die Leistung auch bei String- und Array-Objekten zu verbessern.
Eine wirklich gute Lektüre hier
quelle
Um den Unterschied zwischen Strukturen und Klassen zu verstehen, müssen wir den Hauptunterschied zwischen Wert- und Referenztypen kennen. Strukturen sind Werttypen, und das bedeutet, dass jede Änderung an ihnen nur diesen Wert ändert. Klassen sind Referenztypen, und jede Änderung an einem Referenztyp ändert den an diesem Speicherort oder dieser Referenz zugewiesenen Wert. Beispielsweise:
Beginnen wir mit einer Klasse. Diese Klasse entspricht Equatable, um Instanzen vergleichen zu können. Wir erstellen eine Instanz mit dem Namen
pointClassInstanceA
und andere mit dem NamenpointClassInstanceB
Klasse A weisen Klasse B zu. Jetzt heißt es in der Behauptung, dass sie gleich sind.Ok, was ist hier passiert, warum, wenn wir nur den x-Wert von pointsClassInstanceB geändert haben, hat sich auch der x-Wert von pointClassInstanceA geändert? Nun, dies zeigt, wie Referenztypen funktionieren, wenn wir die Instanz A als Wert von Instanz B zuweisen und dann X von einer von ihnen ändern, werden beide X geändert, da sie dieselbe Referenz haben und was sich geändert hat, war der Wert davon Referenz.
Machen wir dasselbe, aber mit einer Struktur
Wir haben im Grunde die gleiche Struktur wie unsere Klasse, aber jetzt können Sie sehen, dass sich der x-Wert von pointStructInstanceA in diesem Fall nicht geändert hat. Dies liegt daran, dass Werttypen anders funktionieren und jede Änderung an einer ihrer Instanzen " unabhängig "und wird den anderen nicht beeinflussen.
Swift schlägt vor, mehr Werttypen zu verwenden, und Sie können feststellen, dass ihre Bibliotheken auf Strukturen basieren, um die Probleme zu vermeiden, die Referenztypen mit sich bringen, z. B. das unbeabsichtigte Ändern eines Werts usw. Strukturen sind der richtige Weg für Swift. Ich hoffe es hilft.
quelle
Hier ist ein Beispiel, das den Unterschied zwischen Struktur und Klasse genau zeigt.
Screenshot des geschriebenen Codes auf dem Spielplatz
quelle
quelle
Schnelle Typen
Wert Typ :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
copy on write
COW
Referenz Typ :
Class
,Function
reference type
einen neuen Verweis auf die ursprüngliche Instanz zuweisen oder übergeben, wird dieser erstellt (die Adresse der Instanz wird kopiert).Value type
wird empfohlen, standardmäßig zu verwenden . Der größte VorteilValue type
ist, dass sie normalerweise sindthread safe
Reference type
Vorteile:deinit()
kann verwendet werden,===
,Objective-C
Interoperabilität, weilValue Type
in Swift eingeführt wurde.[Weitere Informationen zur Veränderlichkeit]
Auswahl zwischen Strukturen und
Klassentypen
Klassen und Strukturen
quelle
Heute ist viel darüber geschrieben, ich möchte dort eine Analogie hinzufügen. Ich hoffe, Sie werden danach nie Zweifel haben: Fazit : Klassen werden als Referenz übergeben, während Strukturen als Wert übergeben werden.
Angenommen, Sie teilen ein Google Doc Sheet mit Ihrem Freund. Wenn er daran etwas ändert, werden Sie auch sehen, dass Änderungen an Ihrem Google-Dokument bedeuten, dass Ihre Kopie ebenfalls betroffen ist. Das ist im Grunde " als Referenz übergeben ".
Angenommen, Sie haben eine .XLS-Datei auf Ihrem Computer gespeichert. Sie geben diese Datei an Ihren Freund weiter. Wenn er nun Änderungen an dieser Datei vornimmt, wird Ihre Datei nicht durcheinander gebracht, da Sie über eine eigene Kopie verfügen. Das ist im Grunde " von Wert übergeben ". Sie haben bereits mehrere einfache Programme, um diese Analogie auf schnellen Spielplätzen zu überprüfen.
quelle