<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Guilherme Trevisan</title>
    <description>The latest articles on DEV Community by Guilherme Trevisan (@guilhermetrevisan).</description>
    <link>https://dev.to/guilhermetrevisan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F738301%2F9c097381-103b-470c-841f-ed3ca018a248.jpeg</url>
      <title>DEV Community: Guilherme Trevisan</title>
      <link>https://dev.to/guilhermetrevisan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guilhermetrevisan"/>
    <language>en</language>
    <item>
      <title>Protocolos em Swift: Quando e como utilizar</title>
      <dc:creator>Guilherme Trevisan</dc:creator>
      <pubDate>Wed, 27 Oct 2021 15:39:12 +0000</pubDate>
      <link>https://dev.to/guilhermetrevisan/protocolos-em-swift-quando-e-como-utilizar-549</link>
      <guid>https://dev.to/guilhermetrevisan/protocolos-em-swift-quando-e-como-utilizar-549</guid>
      <description>&lt;p&gt;Fala dev! Se você começou no Swift ou em programação recentemente já deve ter se perguntado qual a diferença entre Classes, Structs e Protocolos. A primeira vista eles podem parecer iguais e dar a impressão de que têm a mesma finalidade, principalmente quando comparamos Classes com Structs. Apesar de serem parecidas, essas estruturas de dados tem finalidades diferentes! Esse é o primeiro artigo de três, e nele eu vou falar sobre Protocolos!&lt;/p&gt;

&lt;h3&gt;
  
  
  Sobre a nossa didática
&lt;/h3&gt;

&lt;p&gt;Ao invés de usar exemplos comuns de código com estruturas chamadas &lt;code&gt;Pessoa&lt;/code&gt; ou &lt;code&gt;Animal&lt;/code&gt;, chamaremos nossas estruturas de &lt;code&gt;Foguete&lt;/code&gt;! Vamos para o código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protocols
&lt;/h3&gt;

&lt;p&gt;Os &lt;strong&gt;protocolos são formatos de dados que você pode construir para ter uma estrutura personalizada que armazena e padroniza objetos&lt;/strong&gt;. Eles apenas ditam quais propriedades, métodos ou construtores uma Classe ou Struct deve ter, mas &lt;strong&gt;sem implementa-los!&lt;/strong&gt; Vamos ver um exemplo:&lt;/p&gt;

&lt;p&gt;Imagine que o INPE (Instituto Nacional de Pesquisas Espaciais) precisa salvar todos os projetos de seus foguetes. Cada um deles segue um protocolo de segurança, deve ser transportado e possui um jeito específico de ser lançado, além de ter seus devidos tripulantes, isto é, todos possuem esses métodos e propriedades, mas a implementação e conteúdo deles é sempre diferente. Você poderia pensar "Ora, vamos criar uma classe para cada um", mas sair declarando um monte de classes deliberadamente talvez não seja a melhor solução.&lt;/p&gt;

&lt;p&gt;Vamos criar um protocolo chamado &lt;code&gt;Foguete&lt;/code&gt; e definir nele as características das nossas naves espaciais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;Foguete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;tripulantes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tripulantes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;verificarSeguranca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;transportar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;decolar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito bem, agora nós temos um padrão de construção de objetos &lt;code&gt;Foguete&lt;/code&gt; que pode ser usado para a criação de classes, basta conformar com ele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;FogueteAurora&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Foguete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;tripulantes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="c1"&gt;//init do FogueteAurora&lt;/span&gt;
    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tripulantes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tripulantes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tripulantes&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// verificarSeguranca do FogueteAurora&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;verificarSeguranca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;verificarMotores&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// transportar do FogueteAurora&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;transportar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;transportarNoCaminhao&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// decolar do FogueteAurora&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;decolar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;ligarMotores&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;soltarDaPlataforma&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note os comentários do código. Eles se referem às implementações desse foguete em específico, se alguma outra classe conformar com o nosso protocolo ela poderá implementar os mesmos métodos, mas do jeito que necessita, sem interferir ou ao menos saber sobre a implementação do &lt;code&gt;FogueteAurora&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;Agora você deve estar perguntando "Mas você não disse que criar classes não era uma boa abordagem?". A questão não é criar muitas ou poucas classes, e sim criar classes padronizadas! Com a existência do protocolo todos os foguetes tem implementações dos mesmos métodos e propriedades, mas elas não são necessariamente iguais! E se algum objeto não seguir essa estrutura, não pode ser considerado um objeto do tipo &lt;code&gt;Foguete&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tendo um protocolo para a criação de objetos eu posso ter certeza de que se receber um objeto que conforma com o protocolo X esse item vai ter as características de X! Além disso, fica bem mais fácil criar funções que manipulem objetos com essa estrutura, já que agora você tem uma estrutura de dados para usar como tipo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos ver isso na prática: agora imagine que o INPE queira simular a execução das funções do foguetes com uma outra função. Como faríamos isso se apenas tivéssemos um monte classes? Teríamos que pegar uma por uma, verificar se existem todos os métodos necessários e então executa-los. Isso parece trabalhoso, não? Vamos usar o nosso protocolo e criar uma função assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;executarFuncoesDoFoguete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;foguete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Foguete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;foguete&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;varificarSeguranca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;foguete&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transportar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;foguete&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decolar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recebemos por parâmetro uma variável do tipo &lt;code&gt;Foguete&lt;/code&gt;, que é o nosso protocolo, assim nós sempre temos certeza de que os métodos que estamos chamando dentro da nossa função existem, mesmo que estejam vazios! No caso de estarem vazios nada acontece, mas se não existissem e tentássemos executa-los teríamos um erro… e eu acho que prefiro a primeira opção, embora uma situação dessa fira o conceito de Interface Segregation do SOLID, mas isso é assunto pra outro artigo.&lt;/p&gt;

&lt;p&gt;Pronto, agora basta chamar a função passando para ela um objeto que conforme com Foguete, como o &lt;code&gt;FogueteAurora&lt;/code&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando usar Protocolos?
&lt;/h3&gt;

&lt;p&gt;Quando você tem uma estrutura de dados que precisa ser declarada, mas sua implementação nem sempre será igual.&lt;/p&gt;




&lt;p&gt;Espero ter ajudado a organizar suas ideias, nos vemos na próxima! 😄&lt;/p&gt;




&lt;p&gt;Referências&lt;br&gt;
Protocols - The Swift Programming Language (Swift 5.4): &lt;a href="https://docs.swift.org/swift-book/LanguageGuide/Protocols.html"&gt;https://docs.swift.org/swift-book/LanguageGuide/Protocols.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>programming</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
