Aula 145: Tipos de Coleções Personalizadas em Swift
Nesta aula, vamos nos aprofundar na criação de tipos de coleções personalizadas em Swift. A biblioteca padrão do Swift fornece uma variedade de tipos de coleções, como arrays, sets e dicionários, mas às vezes você pode precisar de uma coleção que sirva a um propósito específico ou forneça comportamentos específicos. Esta aula irá guiá-lo na construção de um tipo de coleção personalizada simples.
Criando uma Coleção Personalizada
Vamos criar uma coleção personalizada chamada Pilha
, que funcionará como uma estrutura de dados do tipo último a entrar, primeiro a sair (LIFO). Esta coleção personalizada suportará operações padrão de coleção e alguns métodos adicionais.
Passo 1: Definir a Estrutura da Pilha
Começaremos definindo uma estrutura Pilha
que manterá um array de elementos.
struct Pilha<Element> {
private var elementos: [Element] = []
mutating func empilhar(_ elemento: Element) {
elementos.append(elemento)
}
mutating func desempilhar() -> Element? {
return elementos.popLast()
}
var estaVazia: Bool {
return elementos.isEmpty
}
var contagem: Int {
return elementos.count
}
func topo() -> Element? {
return elementos.last
}
}
Passo 2: Implementando Protocolos de Coleção
Para fazer com que nossa Pilha
se comporte como um tipo padrão de coleção em Swift, podemos conformar ao protocolo Collection
. Isso requer que implementemos as propriedades e métodos necessários.
extension Pilha: Collection {
var startIndex: Int {
return elementos.startIndex
}
var endIndex: Int {
return elementos.endIndex
}
subscript(index: Int) -> Element {
return elementos[index]
}
func index(after i: Int) -> Int {
return elementos.index(after: i)
}
}
Passo 3: Adicionando Métodos Personalizados
Agora podemos adicionar métodos personalizados que são específicos para a Pilha
. As operações principais—empilhar e desempilhar—já estão definidas, e também poderíamos adicionar métodos para exibir os conteúdos.
extension Pilha {
func imprimirElementos() {
print("Elementos da pilha: \(elementos)")
}
}
Passo 4: Testando a Coleção Personalizada de Pilha
Agora que criamos nossa Pilha
, é hora de testá-la com algumas operações de exemplo.
var minhaPilha = Pilha<Int>()
minhaPilha.empilhar(1)
minhaPilha.empilhar(2)
minhaPilha.empilhar(3)
print("Contagem: \(minhaPilha.contagem)") // Saída: Contagem: 3
minhaPilha.imprimirElementos() // Saída: Elementos da pilha: [1, 2, 3]
if let elementoTopo = minhaPilha.topo() {
print("Elemento do topo: \(elementoTopo)") // Saída: Elemento do topo: 3
}
while let elementoDesempilhado = minhaPilha.desempilhar() {
print("Elemento desempilhado: \(elementoDesempilhado)")
}
// Saída:
// Elemento desempilhado: 3
// Elemento desempilhado: 2
// Elemento desempilhado: 1
print("A pilha está vazia? \(minhaPilha.estaVazia)") // Saída: A pilha está vazia? true
Conclusão
Nesta aula, criamos um tipo de coleção personalizada em Swift definindo uma estrutura Pilha
e implementando os protocolos necessários. Exploramos como criar métodos personalizados juntamente com comportamentos padrão de coleções. As coleções personalizadas podem aumentar consideravelmente a flexibilidade do seu código, permitindo que você encapsule lógica específica relacionada à gestão de dados.
Com essa base, você pode estender seus tipos de coleções personalizadas ainda mais, adicionando mais funcionalidades, conforme necessário, ou criar estruturas de dados totalmente novas adaptadas às suas aplicações!