Como utilizar protocol, struct, class, enun e actor em Swift

Protocol, Struct e Class no Swift: Entenda as Diferenças e Quando Usar Cada Um

Se você está desenvolvendo em Swift, provavelmente já se deparou com protocol, struct e class.

Mas qual a diferença entre eles? Quando usar cada um?

Neste artigo, explicamos esses conceitos de forma clara e objetiva, ajudando você a escolher a melhor opção para o seu código.

Protocol (protocolo) em Swift

Os protocolos em Swift são contratos que definem um conjunto de propriedades e métodos que devem ser implementados por structs, classes ou enums.

Principais Características:

  • Servem como interfaces para tipos.
  • Não podem ser instanciados diretamente.
  • Podem ter implementações padrão (protocol extensions).

Exemplo de Uso:

protocol Veiculo {
    var velocidade: Double { get set }
    func acelerar()
}

Agora, qualquer tipo que adotar Veiculo precisará implementar velocidade e acelerar().

Struct em Swift

As structs são amplamente utilizadas por serem tipos por valor. Isso significa que, ao serem copiadas, cada instância é independente.

Principais Características:

  • Tipos por valor (cópias independentes).
  • Mais eficientes que classes em muitos cenários.
  • Não suportam herança.
  • Podem adotar protocolos.

Exemplo de Struct:

struct Carro: Veiculo {
    var velocidade: Double = 0.0
    
    func acelerar() {
        print("Acelerando o carro!")
    }
}

Class em Swift

As classes são tipos por referência, ou seja, diferentes variáveis podem apontar para o mesmo objeto na memória.

Principais Características:

  • Tipos por referência (apontam para o mesmo objeto).
  • Suportam herança.
  • Permitem polimorfismo.
  • Podem ter deinit (para liberação de recursos).

Exemplo de Classe:

class Moto: Veiculo {
    var velocidade: Double = 0.0
    
    func acelerar() {
        print("Acelerando a moto!")
    }
}

Se fizermos:

let moto1 = Moto()
let moto2 = moto1

moto1.velocidade = 50
print(moto2.velocidade)  // Saída: 50 (pois compartilham a mesma instância)

Diferente das structs, onde cada cópia é independente.

Enum (Enumeração) em Swift

Os enum são tipos especiais que representam um conjunto fixo de valores.

Principais Características:

  • Tipos por valor.
  • Suportam valores associados e raw values.

Exemplo de Enum:

enum TipoCombustivel {
    case gasolina, alcool, eletrico
    
    func descricao() -> String {
        switch self {
        case .gasolina: return "Usa gasolina"
        case .alcool: return "Usa álcool"
        case .eletrico: return "É elétrico"
        }
    }
}

Actor em Swift

Os actor foram introduzidos no Swift 5.5 para garantir segurança concorrente.

Principais Características:

  • Tipos por referência, mas protegidos contra concorrência.
  • Evitam race conditions.

Exemplo de Actor:

actor ContaBancaria {
    private var saldo: Double = 0.0
    
    func depositar(valor: Double) {
        saldo += valor
    }
    
    func getSaldo() -> Double {
        return saldo
    }
}

Uso assíncrono:

let conta = ContaBancaria()
Task {
    await conta.depositar(valor: 100.0)
    print(await conta.getSaldo())  // Saída: 100.0
}

Resumo das Diferenças

Tipo Herança Tipo de Valor ou Referência Uso Comum
protocol Não Depende de quem o implementa Definir contratos/interfaces
struct Não Valor (Cópia) Modelos de dados imutáveis
class Sim Referência Objetos complexos e polimorfismo
enum Não Valor Conjuntos de valores fixos
actor Sim Referência Dados compartilhados entre threads

Conclusão

  • Use struct sempre que possível para evitar complicações com referências.
  • Escolha class apenas quando precisar de herança ou polimorfismo.
  • Utilize protocol para definir contratos reutilizáveis.
  • enum é ideal para conjuntos de valores fixos.
  • Se estiver lidando com concorrência, actor é a melhor escolha.

Agora que você entende a diferença entre protocol, struct, class, enum e actor, pode tomar decisões mais assertivas ao escrever código Swift!

Se tiver alguma dúvida, deixe um comentário! 🚀

Comentários

Postagens mais visitadas deste blog

Como instalar programas no macOS usando o Homebrew

Como instalar a linguagem de programação Swift no Windows

Como instalar a linguagem Swift no Linux com o Swiftly