Afin de comprendre la différence entre les structures et les classes, nous devons connaître la principale différence entre les types valeur et référence. Les structures sont des types de valeur et cela signifie que chaque changement sur eux modifiera simplement cette valeur, les classes sont des types de référence et chaque changement dans un type de référence modifiera la valeur allouée à cet endroit de mémoire ou de référence. Par exemple:
Commençons par une classe, cette classe est conforme à Equatable juste pour pouvoir comparer des instances, nous créons une instance appelée pointClassInstanceA
et une autre appelée pointClassInstanceB
nous assignons la classe A à la classe B, maintenant l'assertion dit qu'elles sont les mêmes ...
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, que s'est-il passé ici pourquoi si nous avons simplement changé la valeur x de pointsClassInstanceB, cela a également changé la valeur x de pointClassInstanceA? Eh bien, cela montre comment les types de référence fonctionnent, lorsque nous affectons l'instance A, en tant que valeur de l'instance B, puis nous modifions X de l'un d'entre eux, cela changera les deux X car ils partagent la même référence et ce qui a changé était la valeur de cela référence.
Faisons la même chose mais avec une structure
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
Nous avons fondamentalement la même structure que notre classe, mais maintenant vous pouvez voir que lorsque vous imprimez la valeur x de pointStructInstanceA, ce cas n'a pas changé, et c'est parce que les types de valeur fonctionnent différemment et que chaque changement sur l'une de leurs instances sera " indépendant "et n'affectera pas l'autre.
Swift suggère d'utiliser plus de types de valeur et vous pouvez dire que leurs bibliothèques sont basées sur des structures pour éviter les problèmes que les types de référence apportent, comme modifier involontairement une valeur, etc. Les structures sont la voie à suivre sur Swift. J'espère que ça aide.