Junior
Qual é a diferença entre estruturas e classes em Swift?
sobes.tech IA
Resposta da IA
Diferenças principais:
- Tipo de valor vs. Tipo de referência: Estruturas são tipos de valor, classes são tipos de referência. Ao atribuir uma estrutura ou passá-la para uma função, o valor é copiado. Ao atribuir uma classe ou passá-la para uma função, a referência a um bloco de memória é copiada.
- Herança: Estruturas não suportam herança. Classes suportam herança, permitindo criar hierarquias de objetos.
- Desinicializadores: Estruturas não têm desinicializadores. Classes podem ter um
deinitpara liberar recursos. - Igualdade de identidade: Para estruturas, o valor de todas as suas propriedades é comparado (por padrão usando
==). Para classes,==por padrão compara referências (identidade). - Desempenho: Estruturas geralmente são mais eficientes ao trabalhar com pequenos volumes de dados, pois não usam alocação dinâmica no heap e não têm custos adicionais de contagem de referências (ARC).
| Critério | Estrutura (Struct) | Classe (Class) |
|---|---|---|
| Tipo | Valores (Tipo de valor) | Referências (Tipo de referência) |
| Herança | Não | Sim |
| Desinicializadores | Não | Sim (deinit) |
| Igualdade de identidade | Comparação por valor | Comparação por referência |
| Localização | Normalmente na pilha (para variáveis locais) | No heap |
| ARC | Não | Sim |
A escolha entre estrutura e classe depende das necessidades. Estruturas são adequadas para modelar dados onde a passagem por valor é importante (por exemplo, coordenadas, tamanho). Classes são usadas quando é necessária herança, uma referência mutável compartilhada a um objeto ou gerenciamento do ciclo de vida do recurso.
// Exemplo de estrutura
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 é uma cópia de p1
p2.x = 5.0
// p1.x ainda é 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Exemplo de classe
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("A instância de Circle está sendo desinicializada.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 referencia a mesma instância que c1
c2.radius = 10.0
// c1.radius também se torna 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Comparação de identidade
if c1 === c2 { // Compara referências
print("c1 e c2 referem-se à mesma instância de Circle.")
} else {
print("c1 e c2 não referem-se à mesma instância de Circle.")
}
// Comparação de valores (para estruturas)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Compara valores de todas as propriedades
print("p1 e p3 têm o mesmo valor.")
} else {
print("p1 e p3 não têm o mesmo valor.")
}