Sobes.tech
Junior

Quais são as diferenças entre tipos de valor e tipos de referência na linguagem de programação Swift?

sobes.tech IA

Resposta da IA

Os tipos de valor (Value Types) e os tipos de referência (Reference Types) diferem na forma como armazenam e transmitem dados.

Tipos de valor:

  • A atribuição cria uma cópia independente dos dados.
  • Os dados são armazenados diretamente no local de declaração ou na pilha (para variáveis locais).
  • Estruturas, enumerações e tuplas são tipos de valor.
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 0, y: 0)
var p2 = p1 // Uma cópia de p1 é criada
p2.x = 10

print(p1.x) // 0
print(p2.x) // 10 - p1 não mudou

Tipos de referência:

  • A atribuição cria uma nova referência aos mesmos dados.
  • Os dados são armazenados no heap, e a referência a eles na declaração ou na pilha.
  • As classes são tipos de referência.
class Rect {
    var width: Int
    var height: Int

    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}

var r1 = Rect(width: 10, height: 20)
var r2 = r1 // r2 agora referencia o mesmo objeto que r1
r2.width = 30

print(r1.width) // 30 - r1 mudou, pois r2 referencia o mesmo objeto
print(r2.width) // 30

Principais diferenças na tabela:

Característica Tipos de valor (Value Types) Tipos de referência (Reference Types)
Atribuição Copia os dados Copia a referência
Armazenamento de dados No local de declaração / Pilha No heap (referência no local de declaração)
Segurança de threads Seguros por padrão para threads Requerem sincronização para threads
Tipos Struct, Enum, Tuple, Array, Dict Class, Function, Closure

A escolha entre tipos depende da tarefa: para representar dados simples e independentes, preferem-se Tipos de valor, e para objetos com uma entidade mutável compartilhada e herança, Tipos de referência (classes). O uso de Tipos de valor pode melhorar o desempenho ao reduzir a carga no heap e simplificar a gestão de memória.