Struct vs Class em Swift: quando e por que escolher a estrutura

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Struct ou Class? A eterna pergunta do desenvolvedor Swift



Todo mundo que começa a programar em Swift, mais cedo ou mais tarde, se depara com essa pergunta. À primeira vista, ambas as construções permitem criar objetos com dados e métodos. Mas por que no Stack Overflow essa pergunta acumula milhares de visualizações, e desenvolvedores experientes cada vez mais preferem as estruturas?



A resposta é simples: porque a escolha entre struct e class afeta diretamente o desempenho, a segurança de threads e a arquitetura do seu aplicativo. Neste artigo, vamos analisar não apenas a teoria, mas exemplos reais e cenários onde Struct definitivamente vence Class.



Se você programa em Swift e ainda usa classes "por hábito" do Objective-C — este artigo é para você. Prepare-se para repensar suas abordagens.


Diferença principal: Value Type vs Reference Type



Antes de nos aprofundarmos nos detalhes, vamos lembrar a diferença fundamental:



  • Struct é um value type (tipo de valor). Ao atribuir ou passar para uma função, uma cópia dos dados é criada.
  • Class é um reference type (tipo de referência). Ao atribuir ou passar para uma função, uma referência para o mesmo objeto na memória é passada.


Parece um detalhe. Mas é dessa diferença "atômica" que decorrem todas as consequências que vamos analisar agora.



Exemplo 1: Comportamento inesperado de Class



class PersonClass {    var name: String    init(name: String) {        self.name = name    }}

struct PersonStruct { var name: String}

// Testando a classelet person1 = PersonClass(name: "Ana")let person2 = person1person2.name = "Maria"

print(person1.name) // Maria! Mudou também em person1print(person2.name) // Maria


Percebeu o problema? Ao alterar o nome de person2, alteramos involuntariamente também o de person1. Afinal, é o mesmo objeto na memória. Em um exemplo pequeno isso não é crítico, mas em um projeto real, essa "modificação colateral" pode levar a bugs difíceis de rastrear.



// Testando a estruturavar person3 = PersonStruct(name: "Ana")var person4 = person3person4.name = "Maria"

print(person3.name) // Ana! Tudo no seu lugarprint(person4.name) // Maria


A estrutura se comporta de forma previsível: cada variável possui sua própria cópia independente dos dados. Isso é seguro e transparente.



Quando Struct é a escolha óbvia?



A Apple, em sua documentação, recomenda usar struct por padrão. Vamos listar cenários específicos onde a estrutura vence sem questionamentos.



1. Dados que devem ser imutáveis



Se você trabalha com modelos que não devem mudar após a criação (por exemplo, resultados de uma requisição ao servidor), struct com propriedades constantes é a escolha ideal.



struct UserProfile {    let id: Int    let name: String    let email: String}

// Criou — e esqueceu. Dados protegidos contra alterações acidentais.let profile = UserProfile(id: 1, name: "João", email: "joao@example.com")


Com uma classe, você ainda poderia alterar name por engano se a propriedade fosse declarada como var. Com a estrutura, o compilador força você a pensar sobre imutabilidade.



2. Entidades pequenas e autossuficientes



Se seu modelo descreve algo simples — coordenadas, dimensões, cor, valor monetário — use struct. É lógico e eficiente.



struct Point {    var x: Double    var y: Double}

struct Money { var amount: Double var currency: String}

struct Rectangle { var origin: Point var size: Size}


Esses tipos não precisam de herança nem gerenciamento de referências. Eles simplesmente

Blogs

Book Recommendations