Para entender a diferença entre estruturas e classes, precisamos conhecer a principal diferença entre os tipos de valor e referência. Estruturas são tipos de valor e isso significa que todas as alterações nelas apenas modificarão esse valor, Classes são tipos de referência e todas as alterações em um tipo de referência modificarão o valor alocado naquele local de memória ou referência. Por exemplo:
Vamos começar com uma classe, essa classe está em conformidade com o Equatable apenas para poder comparar instâncias, criamos uma instância chamada pointClassInstanceA
e outra chamamos a pointClassInstanceB
classe A à classe B, agora a asserção diz que são iguais ...
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, o que aconteceu aqui, por que, se apenas mudássemos o valor x de pointsClassInstanceB, ele também alteraria o valor x de pointClassInstanceA? bem, isso mostra como os tipos de referência funcionam, quando atribuímos a instância A como um valor da instância B e, em seguida, modificamos X de um deles, ele altera os dois Xs porque eles compartilham a mesma referência e o que mudou foi o valor dessa referência.
Vamos fazer o mesmo, mas com uma estrutura
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
Temos basicamente a mesma estrutura da nossa classe, mas agora você pode ver que, quando você imprime o valor x de pointStructInstanceA, neste caso, isso não mudou, e isso ocorre porque os tipos de valor funcionam de maneira diferente e todas as alterações em uma de suas instâncias serão " independente "e não afetará o outro.
Swift sugere usar mais tipos de valor e você pode dizer que suas bibliotecas são baseadas em estruturas para evitar os problemas que os tipos de referência trazem, como modificar acidentalmente um valor etc. Estruturas são o caminho a seguir no Swift. Espero que ajude.