struct — o que é, conceitos-chave e sintaxe em Swift

Autor: IT Sectr Publicado: 2026-06-17 Tempo de leitura: 7 min

Struct é um tipo de valor (value type) na linguagem Swift, cujas instâncias são copiadas ao serem passadas entre partes do código. Ao contrário das classes, as estruturas não suportam herança, mas implementam protocolos, contêm propriedades e métodos, e fornecem gerenciamento de memória previsível sem ARC. De acordo com o Swift Programming Language Guide, 2026, struct é um bloco de construção fundamental do Swift — até mesmo os tipos padrão Int, String, Array e Dictionary são implementados como estruturas. A linguagem recomenda estruturas como a escolha prioritária para modelagem de dados.

Pontos principais

  • Struct é um tipo de valor em Swift que é copiado na atribuição e passado por valor, não por referência.
  • Copy-on-Write é uma otimização em que a cópia real dos dados ocorre apenas quando o valor é modificado, não na atribuição.
  • Mutating é a palavra-chave necessária para métodos que modificam as propriedades de uma estrutura.
  • Protocolos — estruturas podem implementar protocolos e extensões, proporcionando flexibilidade sem herança.
  • Segurança — a ausência de ciclos de referência torna as estruturas preferíveis para código multithread e modelos de dados.

O que é struct em Swift?

Struct (estrutura) é um tipo de dado composto em Swift que agrupa propriedades e métodos relacionados em uma única entidade. Ao contrário das classes, as estruturas são value types: ao serem passadas para uma função ou atribuídas a uma nova variável, uma cópia independente da estrutura é criada, não uma referência ao objeto original.

Swift usa estruturas para todos os tipos primitivos: Int, Double, String, Bool, Array, Dictionary e Set. Isso significa que até mesmo um Int básico se comporta como uma estrutura — uma cópia é criada na atribuição. O desenvolvedor pode definir sua própria estrutura com qualquer conjunto de propriedades e métodos.

De acordo com o Swift Evolution (SE-0143), a decisão de implementar tipos padrão como estruturas é motivada por desempenho e previsibilidade. Value types não criam ciclos de referência, não exigem contagem de referências ARC e garantem que modificar uma cópia não afetará o original — isso é criticamente importante para a imutabilidade de dados em cenários multithread.

Struct como value type

A semântica de value type é a diferença chave entre struct e class. Quando você atribui uma estrutura a uma nova variável ou a passa para uma função, Swift cria uma cópia independente de todos os dados. Quaisquer alterações na cópia não afetam o original, eliminando os efeitos colaterais típicos dos tipos de referência.

swift
// Exemplo de semântica de value type
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 10, y: 20)
var p2 = p1        // p2 é uma cópia independente de p1
p2.x = 99            // Apenas p2 muda
print(p1.x)         // 10 — p1 inalterado
print(p2.x)         // 99

Otimização Copy-on-Write

Swift usa Copy-on-Write (COW) para otimizar a cópia. Se múltiplas variáveis referenciam a mesma estrutura mas nenhuma delas modifica os dados, nenhuma cópia real ocorre. Swift compartilha memória entre as variáveis até a primeira mutação — então uma cópia real é criada. Isso previne operações de alocação excessivas e acelera o trabalho com coleções.

Mutabilidade e métodos mutating

Por padrão, os métodos de uma estrutura não podem modificar suas propriedades — Swift exige a palavra-chave mutating explícita para métodos que fazem alterações. Essa restrição protege contra mutação acidental e torna o código previsível: se um método não está marcado como mutating, você tem a garantia de não alterar a estrutura.

Mutating em ação

Quando você adiciona a palavra-chave mutating antes de um método, Swift ganha a capacidade de escrever novos valores nas propriedades da estrutura. Na verdade, o método pode até substituir completamente a instância da estrutura por uma nova via self =. Este mecanismo é usado, por exemplo, nos tipos Option e Result.

swift
// Struct com método mutating
struct Counter {
    private var value: Int = 0

    // Método mutating — pode modificar propriedades
    mutating func increment() {
        value += 1
    }

    // Método mutating pode substituir self completamente
    mutating func reset() {
        self = Counter()
    }

    // Método não mutating — somente leitura
    func currentValue() -> Int {
        return value
    }
}

var counter = Counter()
counter.increment()
print(counter.currentValue())  // 1
counter.reset()
print(counter.currentValue())  // 0

Regras para mutating: a estrutura deve ser declarada com var, não com let — uma estrutura constante não pode chamar um método mutating. O compilador verifica isso em tempo de compilação: tentar chamar um método mutating em uma constante let resultará em um erro de compilação.

Struct vs Class: comparação

A escolha entre struct e class é uma das decisões fundamentais em Swift. Ambos os tipos podem conter propriedades, métodos, inicializadores e implementar protocolos, mas têm diferenças fundamentais na semântica de memória, herança e gerenciamento de ciclo de vida.

Característicastructclass
TipoValue type (copia)Reference type (referência)
HerançaNão suportaSuporta
ARC / contagem de referênciasNão requeridoARC requerido
DesinicializaçãoNão suportaSuporta deinit
Alteração de propriedades em constantesApenas via varPossível via let (a referência é constante)
Type castingNão suportaSuporta
Armazenamento em coleçõesArmazenado diretamente (valor)Armazenado como referência (ponteiro)

Estruturas são preferíveis quando os dados não requerem herança, não devem ter identidade compartilhada (por exemplo, coordenadas, tamanhos, configuração) e são passados entre módulos. Classes são escolhidas para componentes de UI (UIView, UIViewController), singletons e objetos com identidade compartilhada.

Quando escolher struct

A Apple recomenda usar struct como tipo padrão para modelagem de dados em Swift. Estruturas são adequadas para a maioria dos cenários devido à semântica de cópia previsível e à ausência de sobrecarga de contagem de referências. Vamos ver os casos típicos onde struct é a escolha ideal.

Modelos de dados sem herança

Se uma entidade contém dados sem necessidade de herança (Product, User, Order, Point), use struct. O compilador gera automaticamente um memberwise initializer — você não precisa escrever init manualmente. Equatable e Hashable também são implementados automaticamente para estruturas cujas propriedades estão em conformidade com esses protocolos.

Dados imutáveis

Para configurações, ajustes e flags que não mudam após a criação, struct é preferível a class. Uma estrutura constante (let) garante a imutabilidade de todos os campos aninhados — em uma class isso se aplica apenas à referência, não ao conteúdo do objeto.

Código multithread

Estruturas são seguras em ambientes multithread devido à semântica de valor. Cada thread obtém uma cópia independente dos dados e não afeta outras threads. Condições de corrida entre threads são impossíveis para value types, tornando struct a escolha preferida para modelos em SwiftUI (ObservableObject requer class, mas @State usa struct).

swift
// Exemplo de uso de struct para modelo de dados
struct User: Codable, Identifiable {
    let id: UUID
    var name: String
    var email: String
    var isPremium: Bool

    // Propriedade computada — não mutating
    var displayName: String {
        isPremium ? "\(name) ⭐️" : name
    }
}

// Inicializador memberwise automático
let user = User(
    id: UUID(),
    name: "Alice",
    email: "alice@example.com",
    isPremium: true
)

// Cópia é segura para multithreading
var userCopy = user
userCopy.isPremium = false
// user.isPremium permanece true

Use class quando precisar de herança (componentes UIKit/AppKit), identidade compartilhada (delegate, observer) ou ciclo de vida controlado do objeto (deinit). Para todo o resto — use struct.

Perguntas frequentes

O que é struct em Swift?

Struct em Swift é um tipo de valor (value type) que é copiado ao ser passado entre partes do código. Estruturas podem conter propriedades, métodos, inicializadores e implementar protocolos. Os tipos básicos do Swift (Int, String, Array) são implementados como estruturas.

Qual é a diferença entre struct e class em Swift?

Struct é um value type (copia na atribuição), não suporta herança e não requer ARC. Class é um reference type (passado por referência), suporta herança, desinicialização e contagem de referências. Os desenvolvedores recomendam struct como tipo padrão.

O que é mutating em struct Swift?

Mutating é uma palavra-chave que indica que um método da estrutura pode modificar suas propriedades. Sem mutating, o compilador proíbe a modificação de campos. Métodos mutating só podem ser chamados em variáveis declaradas com var, não com let.

O que é Copy-on-Write em Swift?

Copy-on-Write (COW) é uma otimização do Swift para estruturas em que a cópia real dos dados é adiada até a primeira mutação. Enquanto todas as variáveis apenas leem a estrutura, elas compartilham uma única área de memória. Isso melhora o desempenho ao trabalhar com grandes coleções.

Quando usar struct e quando usar class em Swift?

Use struct para modelos de dados sem herança, configurações, DTOs e cenários multithread. Use class para componentes de UI UIKit/AppKit, singletons, entidades com identidade compartilhada (delegate, observer) e objetos que requerem desinicialização.

Resumo

  • Struct é um tipo de valor em Swift que é copiado na atribuição, proporcionando comportamento previsível sem efeitos colaterais entre cópias.
  • Copy-on-Write otimiza o desempenho das estruturas — a cópia real ocorre apenas na primeira mutação, não em cada atribuição.
  • Os tipos padrão do Swift — Int, String, Array, Dictionary — são implementados como estruturas, garantindo semântica de valor para todas as operações básicas.
  • Mutating é uma palavra-chave obrigatória para métodos que modificam propriedades da estrutura; só pode ser chamada em instâncias var.
  • Estruturas não suportam herança mas implementam protocolos e podem usar extensões para adicionar funcionalidades.
  • Equatable e Hashable são implementados automaticamente para estruturas cujas propriedades estão em conformidade com esses protocolos — simplificando a comparação e o uso em coleções.
  • A Apple recomenda struct como tipo padrão — use class apenas quando herança, identidade compartilhada ou ciclo de vida controlado do objeto forem necessários.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também