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 Namen pointClassInstanceB
Klasse A weisen Klasse B zu. Jetzt heißt es in der Behauptung, dass sie gleich sind.
class PointClass: Equatable {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
static func == (lhs: PointClass, rhs: PointClass) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var pointClassInstanceA = PointClass(x: 0, y: 0)
var pointClassInstanceB = pointClassInstanceA
assert(pointClassInstanceA==pointClassInstanceB)
pointClassInstanceB.x = 10
print(pointClassInstanceA.x)
//this prints 10
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
struct PointStruct: Equatable {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
static func == (lhs: PointStruct, rhs: PointStruct) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var pointStructInstanceA = PointStruct(x: 0, y: 0)
var pointStructInstanceB = pointStructInstanceA
assert(pointStructInstanceA==pointStructInstanceB)
pointStructInstanceB.x = 100
print(pointStructInstanceA.x)
//this will print 0
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.