SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
26.11.2024

Aula 140: Programação Avançada Orientada a Protocolos em Swift

Na linguagem Swift, a programação orientada a protocolos prioriza o uso de protocolos em vez da herança de classes. Este paradigma promove maior flexibilidade e modularidade em seu código. Nesta aula, vamos nos aprofundar em conceitos avançados dentro da programação orientada a protocolos, incluindo extensões de protocolo, tipos associados e composição de protocolos. Vamos explorar como aproveitar esses recursos de forma eficaz.

Extensões de Protocolo

As extensões de protocolo permitem que você forneça implementações padrão para métodos, propriedades e subscritos de protocolos. Isso significa que os tipos que implementam o protocolo podem usar essas implementações sem precisar implementá-las explicitamente.

protocol Descritivo {
    var descricao: String { get }
}

extension Descritivo {
    var descricao: String {
        return "Esta é uma descrição de \(Self.self)."
    }
}

struct Pessoa: Descritivo { }

let pessoa = Pessoa()
print(pessoa.descricao)  // Saída: Esta é uma descrição de Pessoa.

Neste exemplo, qualquer tipo que implemente o protocolo Descritivo recebe automaticamente uma descrição padrão.

Tipos Associados

Tipos associados permitem que você defina tipos de espaço reservado dentro de protocolos. Isso é especialmente útil quando você deseja criar um protocolo que não dependa do tipo real que está sendo usado.

protocol Container {
    associatedtype TipoItem
    var itens: [TipoItem] { get }
    mutating func adicionar(item: TipoItem)
}

struct ContainerDeInt: Container {
    var itens = [Int]()

    mutating func adicionar(item: Int) {
        itens.append(item)
    }
}

struct ContainerDeString: Container {
    var itens = [String]()

    mutating func adicionar(item: String) {
        itens.append(item)
    }
}

var containerDeInt = ContainerDeInt()
containerDeInt.adicionar(item: 5)
print(containerDeInt.itens)  // Saída: [5]

var containerDeString = ContainerDeString()
containerDeString.adicionar(item: "Olá")
print(containerDeString.itens)  // Saída: ["Olá"]

Aqui, dois contêineres separados são criados para os tipos Int e String, respectivamente, mostrando a flexibilidade oferecida pelos tipos associados.

Composição de Protocolos

A composição de protocolos permite combinar múltiplos protocolos em um único requisito. Isso é útil quando você deseja que um tipo implemente vários protocolos simultaneamente.

protocol Voador {
    func voar()
}

protocol Nadador {
    func nadar()
}

struct Pato: Voador, Nadador {
    func voar() {
        print("O pato está voando.")
    }

    func nadar() {
        print("O pato está nadando.")
    }
}

func fazerVoarENadar(animal: any Voador & Nadador) {
    animal.voar()
    animal.nadar()
}

let pato = Pato()
fazerVoarENadar(animal: pato)
// Saída:
// O pato está voando.
// O pato está nadando.

Neste código, criamos um tipo Pato que implementa os protocolos Voador e Nadador. Em seguida, definimos uma função que exige um argumento que implemente ambos os protocolos usando composição de protocolos.

Conclusão

A programação orientada a protocolos em Swift permite que você construa código mais manutenível e modular. Por meio de extensões de protocolo, tipos associados e composição de protocolos, você pode criar componentes flexíveis e reutilizáveis. Ao enfatizar protocolos em vez da herança de classes, você aprimora a interoperabilidade e a adaptabilidade do seu código.

Experimente esses conceitos em seus projetos Swift para aprofundar seu entendimento e desbloquear todo o potencial da programação orientada a protocolos!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!