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!