Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Protocolo

Existe algum material que fale mais sobre protocolo? O que é? Quando usar?

Obrigado.

2 respostas
solução!

É bem difícil achar material que fale de swift em português, tornando os estudos um pouco mais difícil para quem quer aprender e não domina o inglês. Mas não tem outro jeito, recomendo que busque na internet mesmo explicações, de preferencia procure em inglês. Baixa o app do medium e busca por lá

Inclusive, acho que alura/caelum poderiam fazer um livro mais completo sobre a linguagem swift. Lá na casa do código só tem um livro que é bem simples, mesma coisas dos primeiros três cursos, o aplicativo de comida, então quem ficou com dúvida, infelizmente lendo esse livro não resolve. E aqui nos fóruns dificilmente respondem e quando responde não são respostas tão completas.

A analogia mais direta para entender protocol em swift é:

Um protocol é bem semelhante a uma interface Java

Então, dessa comparação já podemos ter uma boa ideia de quando e como devemos usá-lo. Dê uma olhada nesse exemplo:

Suponha o protocolo Exibivel, que define um método que todo elemento exibível na tela deve ter:

protocol Exibivel {
    func imprime()
}

Perceba que no protocol só devemos colocar a assinatura dos métodos e não o seu conteúdo (o método imprime não tem corpo)!

Beleza. Se o protocol tem só a assinatura dos métodos, onde fica o conteúdo deles? Agora precisamos fazer uma classe que implementa esse protocol:

class Pessoa : Exibivel {
    func imprime() {
        //Aqui é o corpo do método imprime
    }
}

Veja que a classe Pessoa implementa o protocol Exibivel, então ela deve definir o conteúdo do método imprime.

class Pessoa : Exibivel {
    func imprime() {
        print ("Sou uma pessoa!")
    }
}

Podemos criar uma outra classe qualquer e dizer que ela também é um elemento exibível:

class Animal : Exibivel {
    func imprime() {
        print("Sou um animal!")
    }
}

Como Pessoa e Animal são Exibivel, podemos usar essa característica em comum num método:

class Mostrador {
    func mostra(elemento: Exibivel) {
        elemento.imprime()
    }
}

Veja que o método mostra(elemento:) não sabe se virá uma Pessoa ou Animal, mas sabe que independentemente do objeto ele deverá possuir o método imprime, que todo Exibivel tem.

Logo, podemos usar nossa classe Mostrador da seguinte forma:

let animal = Animal()
let pessoa = Pessoa()
let mostrador = Mostrador()
mostrador.mostra(elemento: animal) //(1)
mostrador.mostra(elemento: pessoa) //(2)

Resultando em:

Sou um animal! //(1)
Sou uma pessoa! //(2)

Perceba que a variável animal é do tipo Animal, porém como ela implementa Exibivel, podemos usar animal em qualquer lugar que precise de um Exibivel.

Chamamos essa característica de polimorfismo. ;)

Ou seja: usamos protocol quando queremos favorecer polimorfismo, permitindo que um método não precise conhecer o tipo real que será passado, apenas conheça o protocol.

Podemos fazer umas coisas mais avançadas num protocol, mas deixo para uma próxima. Beleza?