Swift – Extendendo protocolos

Junto com o Swift a Apple trouxe a programação orientada a protocolos. Hoje vamos ver como usar um importante recurso desse modelo de programação, as extensões de protocolos.

As extensões de protocolo servem para garantir uma implementação padrão para as funções declaradas no protocolo (todas ou algumas delas). Vamos aos exemplos.

1 – Vamos criar um protocolo com a definição das funções:

[markdown]
“`
protocol HelloProtocol {

func getLanguage() -> String
func helloWorld()
func helloUniverse()
}
“`
[/markdown]

2 – Vamos agora criar a nossa extensão, criando o comportamento padrão para cada uma dessas funções:

[markdown]
“`
extension HelloProtocol {

func getLanguage() -> String {
return “English”
}

func helloWorld() {
print(“Hello World!”)
}

func helloUniverse() {
print(“Hello Universe!”)
}
}
“`
[/markdown]

3 – Feito isso, podemos criar classes ou estruturar que implementem esse protocolo:

[markdown]
“`
struct HelloEnUS: HelloProtocol {
}

struct HelloEnGB: HelloProtocol {
}

“`
[/markdown]

Ao executar as funções de cada uma dessas structs

[markdown]
“`
let enUS = HelloEnUS()
enUS.getLanguage()
enUS.helloWorld()
enUS.helloUniverse()

let enGB = HelloEnGB()
enGB.getLanguage()
enGB.helloWorld()
enGB.helloUniverse()

“`
[/markdown]

Teremos o seguinte resultado:

[markdown]
“`
English
Hello World!
Hello Universe!
English
Hello World!
Hello Universe!
“`
[/markdown]

Isso por que essas duas structs, recebem “gratuitamente” as implementações padrão da extensão do protocolo.

4 – Podemos também criar comportamento específicos para nossas classe ou estruturas, para isso basta reescrever as funções do protocolo.

[markdown]
“`
struct HelloPtBR: HelloProtocol {
func getLanguage() -> String { return “Portugues” }

func helloWorld() {
print(“Olá Mundo!”)
}

func helloUniverse() {
print(“Olá Universo!”)
}
}

struct HelloEsES: HelloProtocol {
var getLanguage: String { return “Español” }

func helloWorld() {
print(“Hola Mundo!”)
}

func helloUniverse() {
print(“Hola Universo!”)
}
}
“`
[/markdown]

Ao executar as funções de cada uma dessas novas structs

[markdown]
“`
let ptBR = HelloPtBR()
ptBR.getLanguage()
ptBR.helloWorld()
ptBR.helloUniverse()

let EsES = HelloEsES()
EsES.getLanguage()
EsES.helloWorld()
EsES.helloUniverse()
“`
[/markdown]

Teremos o seguinte resultado:

[markdown]
“`
Portugues
Olá Mundo!
Olá Universo!
Español
Hola Mundo!
Hola Universo!
“`
[/markdown]

Isso por que essas duas structs, reescrevem as implementações padrão da extensão do protocolo.

Com essa técnica, podemos fazer chamadas idênticas à esses objetos e termos comportamentos diferentes, no exemplo a seguir vamos fazer uma array com todos esses objetos e dentro de um loop vamos chamar os métodos de cada um deles para vermos “lado a lado” todos os resultados diferentes.

[markdown]
“`
let languages: [HelloProtocol] = [HelloEnUS(), HelloPtBR(), HelloEsES(), HelloEnGB()]

languages.forEach { (language) in
print(language.getLanguage)
print(language.helloWorld())
print(language.helloUniverse())
}
“`
[/markdown]

O resultado desse trecho de código é o seguinte:

[markdown]
“`
English
Hello World!
Hello Universe!
Portugues
Olá Mundo!
Olá Universo!
Español
Hola Mundo!
Hola Universo!
English
Hello World!
Hello Universe!
“`
[/markdown]

O arquivo .playground desse post pode ser baixado aqui.

Até a próxima.

CTA-ebook-transformação-digital

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>