Sobes.tech
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 deinit para 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.")
}