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) // MariaPercebeu 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) // MariaA 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