Per comprendere la differenza tra le strutture e le classi, dobbiamo conoscere la differenza principale tra valore e tipi di riferimento. Le strutture sono tipi di valore e ciò significa che ogni cambiamento su di esse modificherà quel valore, le classi sono tipi di riferimento e ogni cambiamento in un tipo di riferimento modificherà il valore allocato in quel luogo di memoria o riferimento. Per esempio:
Cominciamo con una classe, questa classe è conforme a Equatable solo per poter confrontare istanze, creiamo un'istanza chiamata pointClassInstanceA
e altre chiamate pointClassInstanceB
assegniamo la classe A alla classe B, ora l'asserzione dice che sono uguali ...
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, cosa è successo qui perché se abbiamo appena cambiato il valore x di pointsClassInstanceB, ha cambiato anche il valore x di pointClassInstanceA? bene, questo mostra come funzionano i tipi di riferimento, quando assegniamo l'istanza A, come valore dell'istanza B e poi modifichiamo X di uno di essi cambierà entrambi gli X perché condividono lo stesso riferimento e ciò che è cambiato è stato il valore di quello riferimento.
Facciamo lo stesso ma con una struttura
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
Abbiamo sostanzialmente la stessa struttura della nostra classe, ma ora puoi vedere che quando stampi il valore x di pointStructInstanceA questo caso non è cambiato, e questo perché i tipi di valore funzionano in modo diverso e ogni modifica su una delle loro istanze sarà " indipendente "e non influirà sull'altro.
Swift suggerisce di usare più tipi di valore e puoi dire che le loro librerie sono basate su strutture per evitare i problemi che portano i tipi di riferimento, come modificare involontariamente un valore ecc. Le strutture sono la strada da percorrere su Swift. Spero che sia d'aiuto.