<?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: Matheus dos Reis de Jesus</title>
    <description>The latest articles on DEV Community by Matheus dos Reis de Jesus (@reisdev).</description>
    <link>https://dev.to/reisdev</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%2F143197%2Feda5e20b-7f8b-4816-9e96-c893bd7b5547.png</url>
      <title>DEV Community: Matheus dos Reis de Jesus</title>
      <link>https://dev.to/reisdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reisdev"/>
    <language>en</language>
    <item>
      <title>Como programar em Swift no Linux</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Thu, 18 Jul 2024 17:04:03 +0000</pubDate>
      <link>https://dev.to/reisdev/como-programar-em-swift-no-linux-52j5</link>
      <guid>https://dev.to/reisdev/como-programar-em-swift-no-linux-52j5</guid>
      <description>&lt;p&gt;Aprender a programar em Swift, para quem não tem um dispositivo da Apple, parece impossível. Porém, muita gente não sabe que a linguagem  Swift é de código-aberto e pode ser usada no macOS, Windows e Linux. Hoje, veremos o passo-a-passo para os SOs Linux, mais especificamente, o Ubuntu.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; Não é possível criar apps para os dispositivos da Apple usando os sistemas operacionais Linux. Para isso, é preciso usar o macOS ou iPadOS. Porém, é possível aprender e programar em Swift, o que já é um ótimo começo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Download da Toolchain
&lt;/h2&gt;

&lt;p&gt;Primeiramente, vamos realizar o download do arquivo compactado contendo a toolchain de Swift, que dá suporte à compilação e execução de código em Swift. Para isso, acesse a página a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.swift.org/install" rel="noopener noreferrer"&gt;https://www.swift.org/install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nela, é possível escolher o sistema operacional desejado para obter os arquivos de instalação:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmfhgqxurnotj5apwiz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmfhgqxurnotj5apwiz5.png" alt="Captura de tela da página de instalação de Swift com 3 opções listadas: macOS, Linux e Windows" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como vamos utilizar como base o Ubuntu Linux como base para esse tutorial, basta selecionar a opção &lt;code&gt;Linux&lt;/code&gt;, e em seguida a opção da plataforma &lt;code&gt;Ubuntu&lt;/code&gt;. Após isso, é possível selecionar a versão do Ubuntu em que será realizada a instalação. No meu caso, é a &lt;code&gt;22.04&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escolha a opção correspondente à sua instalação do Ubuntu:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt8wubn5b2ftewxm0161.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt8wubn5b2ftewxm0161.png" alt="Captura de tela com as opções Linux, plataforma Ubuntu e versão Ubuntu 22.04 selecionadas" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso, iremos realizar o download do tarball contendo a toolchain. Para isso, primeiro, é necessário saber qual a arquitetura do seu processador: &lt;code&gt;x86_64&lt;/code&gt; ou &lt;code&gt;arm64&lt;/code&gt;. Para isso, execute o comando abaixo no seu terminal de preferência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a saída for &lt;code&gt;x86_64&lt;/code&gt;, clique na opção abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu0nk2l4sd12m113c2oc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu0nk2l4sd12m113c2oc.png" alt="Captura de tela com o botão " width="547" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se for &lt;code&gt;aarch64&lt;/code&gt; ou &lt;code&gt;arm64&lt;/code&gt;, clique na opção abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxliigqurg66mgfae1qi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxliigqurg66mgfae1qi.png" alt="Captura de tela com o botão " width="556" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso, o download de um arquivo &lt;code&gt;.tar.gz&lt;/code&gt; será realizado. Agora, você pode acessar o link a seguir para acompanhar o processo de instalação:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.swift.org/install/linux/tarball/" rel="noopener noreferrer"&gt;https://www.swift.org/install/linux/tarball/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação das dependências
&lt;/h2&gt;

&lt;p&gt;Antes de instalarmos a toolchain em si, é necessário garantir a instalação de todas as dependências da linguagem. O link anterior possui algumas seções contendo as dependências para cada SO Linux:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkyygfutfe7tyzk2g31g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkyygfutfe7tyzk2g31g.png" alt="Captura de tela com as opções de sistemas operacionais baseados no Linux e suas respectivas dependências" width="364" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estranhamente, não há uma opção para o Ubuntu 22.04, então usei as mesmas dependências do 20.04. Antes de instalar as dependências, é importante executar o comando para atualizar os pacotes já existentes na sua máquina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Permissões de administrador podem ser necessárias para executar os comandos no terminal. Para isso, basta adicionar o &lt;code&gt;sudo&lt;/code&gt; antes dos comandos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Feito isso, basta instalar as dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
          binutils &lt;span class="se"&gt;\&lt;/span&gt;
          git &lt;span class="se"&gt;\&lt;/span&gt;
          gnupg2 &lt;span class="se"&gt;\&lt;/span&gt;
          libc6-dev &lt;span class="se"&gt;\&lt;/span&gt;
          libcurl4 &lt;span class="se"&gt;\&lt;/span&gt;
          libedit2 &lt;span class="se"&gt;\&lt;/span&gt;
          libgcc-9-dev &lt;span class="se"&gt;\&lt;/span&gt;
          libpython2.7 &lt;span class="se"&gt;\&lt;/span&gt;
          libsqlite3-0 &lt;span class="se"&gt;\&lt;/span&gt;
          libstdc++-9-dev &lt;span class="se"&gt;\&lt;/span&gt;
          libxml2 &lt;span class="se"&gt;\&lt;/span&gt;
          libz3-dev &lt;span class="se"&gt;\&lt;/span&gt;
          pkg-config &lt;span class="se"&gt;\&lt;/span&gt;
          tzdata &lt;span class="se"&gt;\&lt;/span&gt;
          uuid-dev &lt;span class="se"&gt;\&lt;/span&gt;
          zlib1g-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após instalar as dependências, podemos finalmente realizar a instalação da toolchain. Vamos acessar a pasta downloads para extrair o arquivo que baixamos anteriormente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Downloads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, podemos extrair o conteúdo do arquivo comprimido. O nome será parecido com:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;swift-&amp;lt;versao&amp;gt;-RELEASE-&amp;lt;plataforma&amp;gt;-&amp;lt;arquitetura&amp;gt;.tar.gz&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ tar xzf &amp;lt;nome-do-arquivo&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção&lt;/strong&gt;: O nome do arquivo .tar.gz pode variar de acordo com a versão da toolchain que for obtida no site. Você pode começar digitando &lt;code&gt;~/.Downloads/swift-&lt;/code&gt; e apertar tab para que o terminal complete o restante.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Os arquivo comprimido será extraído para uma pasta de mesmo nome. Agora, iremos mover esta para um novo destino:&lt;/p&gt;

&lt;p&gt;Agora, vamos criar uma pasta para onde iremos extrair a toolchain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &amp;lt;nome-da-pasta&amp;gt; ~/.swift-toolchain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora já temos a toolchain no lugar correto. O próximo passo é torná-la acessível pelo terminal, modificando a variável &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;É preciso adicionar o seguinte caminho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"~/.swift-toolchain/usr/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use seu arquivo de preferência para inserir essa modificação (&lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.bash_profile&lt;/code&gt;, &lt;code&gt;.zprofile&lt;/code&gt; ou outro):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"~/.swift-toolchain/usr/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para confirmar que a instalação foi um sucesso, você pode executar o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;swift &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado deverá ser similar a esse(a depender do seu SO e arquitetura)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Swift version 5.10.1 &lt;span class="o"&gt;(&lt;/span&gt;swift-5.10.1-RELEASE&lt;span class="o"&gt;)&lt;/span&gt;
Target: aarch64-unknown-Linux-gnu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, já é possível executar código Swift na sua máquina.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como executar código em Swift
&lt;/h2&gt;

&lt;p&gt;Agora que já temos a toolchain instalada, podemos criar código em Swift.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ATENÇÃO&lt;/strong&gt;: Como dito anteriormente, não é possível criar apps para iOS/iPad/macOS/tvOS em ambiente Linux. Frameworks específicos como &lt;code&gt;UIKit&lt;/code&gt;, &lt;code&gt;SwiftUI&lt;/code&gt; e outros não estão disponíveis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Primeiro, vamos criar um arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;exemplo.swift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arquivo criado, podemos abrí-lo com nosso editor de preferência. Pode ser o Visual Studio Code, nano, o que preferir. Eu usei o &lt;code&gt;vim&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;vim exemplo.swift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F785nac42dt9jzujri3h6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F785nac42dt9jzujri3h6.png" alt="Captura de tela do arquivo exemplo.swift aberto no editor vim. O arquivo diz print(" width="756" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, podemos executar o código no terminal e ver o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;swift exemplo.swift 
Hello, world!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com tudo configurado, agora você já pode começar a programar em Swift sem precisar de um dispositivo da Apple. Gostou desse artigo? Compartilhe!&lt;/p&gt;

&lt;p&gt;Até à próxima 👋🏽&lt;/p&gt;

</description>
      <category>swift</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como criar um App para iOS em ViewCode</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Fri, 21 Jul 2023 14:35:17 +0000</pubDate>
      <link>https://dev.to/reisdev/como-criar-um-app-ios-em-viewcode-3l8j</link>
      <guid>https://dev.to/reisdev/como-criar-um-app-ios-em-viewcode-3l8j</guid>
      <description>&lt;h2&gt;
  
  
  1. Contexto
&lt;/h2&gt;

&lt;p&gt;ViewCode é um termo usado para descrever a construção de interfaces de usuário utilizando apenas código. Inicialmente as telas eram criadas usando Storyboard/XIB, através da interface gráfica do próprio Xcode. Porém, existiam alguns problemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesso limitado a propriedades dos elementos&lt;/li&gt;
&lt;li&gt;Conflitos de modificação de arquivos (&lt;em&gt;merge hell&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Quando o app crescia muito, os arquivos ficavam pesados e causavam lentidão no Xcode (Storyboard)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então, foi se criando um novo padrão, apelidado de &lt;code&gt;ViewCode&lt;/code&gt;. Neste artigo, veremos brevemente como ele funciona e como criar um app do zero baseado nesse formato.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1. Contexto&lt;/li&gt;
&lt;li&gt;2. Criando o app&lt;/li&gt;
&lt;li&gt;3. Removendo o Storyboard&lt;/li&gt;
&lt;li&gt;
4. ViewCode

&lt;ul&gt;
&lt;li&gt;4.1. Configurando o ViewCode&lt;/li&gt;
&lt;li&gt;4.2. Criando um protocolo ViewCode&lt;/li&gt;
&lt;li&gt;4.3. Criando uma View com ViewCode&lt;/li&gt;
&lt;li&gt;4.4. Usando a View na ViewController&lt;/li&gt;
&lt;li&gt;4.5. Adicionando uma ação ao botão&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;5. Conclusão&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Criando o app
&lt;/h2&gt;

&lt;p&gt;O primeiro passo, obviamente, é criar um app. Para criar este tutorial estou usando a versão 14.3.1 do Xcode. Caso você esteja usando uma versão diferente, alguns detalhes podem mudar.&lt;/p&gt;

&lt;p&gt;Primeiramente, abrimos o Xcode e clicamos em &lt;code&gt;Create a new Xcode Project&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc00t73yt74seovgi4la.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc00t73yt74seovgi4la.png" alt="Captura de tela da tela inicial do Xcode, com a lista de ações possíveis e os projetos recentes" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, o Xcode irá abrir uma janela para seleção do tipo de aplicativo a ser criado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8fcx0ubmke7q5v18veg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8fcx0ubmke7q5v18veg.png" alt="Captura de tela da etapa de criação de um novo projeto no Xcode, exibindo as possíveis opções para cada plataforma" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para este tutorial, iremos escolher a plataforma &lt;code&gt;iOS&lt;/code&gt; e a opção &lt;code&gt;App&lt;/code&gt;, e então clicar em &lt;code&gt;Next&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj80ahg9ct46zpk72q39b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj80ahg9ct46zpk72q39b.png" alt="Captura de tela do Xcode na etapa de criação de projeto com a aba iOS e a opção App selecionadas" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A próxima etapa consiste em nomear o projeto e escolher algumas configurações básicas, como nome do app, time, &lt;em&gt;Bundle identifier&lt;/em&gt;, tipo de interface(UI) e linguagem. Também é possível optar por usar &lt;code&gt;CoreData&lt;/code&gt; sincronizado com a nuvem e incluir testes. Para este tutorial, o mais importante é selecionar modificar as seguintes opções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Interface → Storyboard&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;Language → Swift&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim, garantimos que nosso app estará configurado para usar a linguagem Swift(e não Obj-C) e, por padrão, a interface será criada com Storyboard(e não SwiftUI).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc3au7fgxxrujae4shc3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc3au7fgxxrujae4shc3.png" alt="Captura de tela do Xcode na etapa de escolha de opções para o novo projeto" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após clicar em &lt;code&gt;Next&lt;/code&gt;, o Xcode irá apresentar uma tela para escolher onde deseja salvar os arquivos do seu projeto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2chpq3ikt5z48fu6c50h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2chpq3ikt5z48fu6c50h.png" alt="Captura de tela do Xcode exibindo o Finder para selecionar onde deseja salvar o novo projeto" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bast selecionar a pasta desejada e clicar no botão &lt;code&gt;Create&lt;/code&gt;. Feito isso, seu projeto estará criado e será aberto pelo Xcode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0qlvjpimmn62rh25a83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0qlvjpimmn62rh25a83.png" alt="Captura de tela do Xcode com o projeto ExampleApp criado aberto" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que já temos um novo projeto, vamos para o próximo passo: remover o Storyboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Removendo o Storyboard
&lt;/h2&gt;

&lt;p&gt;Nas propriedades do projeto &lt;code&gt;ExampleApp&lt;/code&gt;, que já são abertas logo após a criação do mesmo, precisamos acessar a aba &lt;code&gt;Info&lt;/code&gt; Caso você, por acaso, feche essa janela, é possível acessá-la novamente clicando duas vezes no item do projeto na barra lateral esquerda:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpqg4cczot1u1f1ws3ad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpqg4cczot1u1f1ws3ad.png" alt="Captura de tela do Xcode destacando item do projeto e a aba Info" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na aba &lt;code&gt;Info&lt;/code&gt;, na seção &lt;code&gt;Custom iOS Target Properties&lt;/code&gt;, encontre os itens &lt;code&gt;Main Storyboard file base name&lt;/code&gt; e &lt;code&gt;Application Scene Manifest → Scene Configuration → Default Configuration &amp;gt; Storyboard name&lt;/code&gt; e remova-os da lista, usando o ícone de menos próximo ao nome do item ou selecionando-o e apertando a tecla delete/backspace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8v9os7ft19fkj1a512x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8v9os7ft19fkj1a512x.png" alt="Captura de tela destacando o item Main Storyboard file base name e uma seta indicando o botão de menos, para remover o item" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floc4p02oi7xd44sloqbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floc4p02oi7xd44sloqbk.png" alt="Captura de tela destacando o item Storyboard name e com uma seta indicando o botão de menos, para remover o item" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após excluir estes itens, podemos remover o arquivo &lt;code&gt;Main.storyboard&lt;/code&gt; do nosso projeto, já que ele não será mais necessário. Para isso, basta encontrá-lo na barra lateral esquerda e apagá-lo, usando o atalho &lt;code&gt;Cmd+Delete&lt;/code&gt; ou pelo menu de atalhos, como abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv73gb2yyts4dbuyzwzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv73gb2yyts4dbuyzwzy.png" alt="Captura de tela do Xcode com o arquivo Main.storyboard selecionado, com a caixa de opções aberta e o item Delete em destaque" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que nosso projeto não possui mais um arquivo Storyboard, podemos começar a configurar nosso app para ser construído usando ViewCode.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. ViewCode
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1. Configurando o ViewCode
&lt;/h3&gt;

&lt;p&gt;Já que não temos mais um Storyboard para apresentar nossa tela, precisamos definir um novo responsável por essa apresentação. Para isso, vamos acessar o arquivo &lt;code&gt;SceneDelegate&lt;/code&gt; e fazer algumas modificações no método &lt;code&gt;scene&lt;/code&gt;. Inicialmente, ele já vem com alguns comentários, mas, pra encurtar o trecho de código, eles foram removidos nesse exemplo. Inicialmente, esse é o conteúdo do método:&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;SceneDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIResponder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UIWindowSceneDelegate&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;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIWindow&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIScene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;willConnectTo&lt;/span&gt; &lt;span class="nv"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UISceneSession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="nv"&gt;connectionOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIScene&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;ConnectionOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scene&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;UIWindowScene&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; 
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// [...] Outros métodos do SceneDelegate&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Primeiro, iremos obter a &lt;code&gt;scene&lt;/code&gt; que nosso método recebe e tentar convertê-la em uma &lt;code&gt;UIWindowScene&lt;/code&gt;. Isso já está escrito no método, porém o valor da conversão está sendo descartado, por conta do &lt;code&gt;let _ = [...]&lt;/code&gt;. Para isso, basta nomearmos a atribuição para obter o valor:&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="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;windowScene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scene&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;UIWindowScene&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Precisamos fazer essa conversão e obter o valor pois iremos usá-lo criação da nossa &lt;code&gt;UIWindow&lt;/code&gt; usada no &lt;code&gt;SceneDelegate&lt;/code&gt;:&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="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;windowScene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;windowScene&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com uma window definida, o próximo passo é instanciar uma &lt;code&gt;UINavigationController&lt;/code&gt; para ser apresentada, para que nosso app já seja construído com suporte para navegação.&lt;/p&gt;

&lt;p&gt;O projeto &lt;code&gt;ExampleApp&lt;/code&gt; já foi criado com uma &lt;code&gt;ViewController&lt;/code&gt; de exemplo, e ela será a tela inicial(&lt;code&gt;rootViewController&lt;/code&gt;) da navegação do nosso app:&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="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;navigationController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UINavigationController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rootViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora que já temos uma &lt;code&gt;UINavigationController&lt;/code&gt;, podemos defini-la como sendo a raiz(&lt;code&gt;rootViewController&lt;/code&gt;) das nossas telas na &lt;code&gt;window&lt;/code&gt;. Em seguida, fazemos com ela seja definida como a principal e apresentada na tela através do método &lt;code&gt;makeKeyAndVisible&lt;/code&gt;:&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="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootViewController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;navigationController&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;window&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makeKeyAndVisible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após cada passo citado acima, teremos o seguinte código:&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;SceneDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIResponder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UIWindowSceneDelegate&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;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIWindow&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIScene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;willConnectTo&lt;/span&gt; &lt;span class="nv"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UISceneSession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="nv"&gt;connectionOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIScene&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;ConnectionOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;windowScene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scene&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;UIWindowScene&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&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;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;windowScene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;windowScene&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;navigationController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UINavigationController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rootViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewController&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;window&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootViewController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;navigationController&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;window&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makeKeyAndVisible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// [...] Outros métodos do SceneDelegate&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A próxima etapa consiste em criar um padrão para construção das views através de um protocolo.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2. Criando um protocolo ViewCode
&lt;/h3&gt;

&lt;p&gt;Uma padronização muito interessante é criar um protocolo que irá definir o formato que uma &lt;code&gt;UIView&lt;/code&gt; construída em ViewCode deve ter. Dessa forma, todas as views terão um mesmo padrão de construção e ficará mais fácil de encontrar informações importantes.&lt;/p&gt;

&lt;p&gt;A seguir, uma sugestão de protocolo que possui o básico necessário para manter a construção de uma view bem organizada:&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="c1"&gt;// Arquivo ViewCode.swift&lt;/span&gt;
&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;ViewCode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;addSubviews&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setupConstraints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setupStyle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;ViewCode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;addSubviews&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;setupConstraints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;setupStyle&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;Uma breve explicação de cada método definido acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;addSubviews()&lt;/code&gt;: Adiciona as views como subviews e define a hierarquia entre elas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setupConstraints()&lt;/code&gt;: Define as constraints a serem usadas para posicionar os elementos na view&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setupStyle()&lt;/code&gt;: Define os estilos da view, como cor, bordas e etc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setup()&lt;/code&gt;: Executa os três métodos anteriores como parte do processo padrão de inicialização de uma view&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OBS: Criamos o método &lt;code&gt;setup&lt;/code&gt; em uma &lt;code&gt;extension&lt;/code&gt; do protocolo porque não é possível criar implementações de métodos diretamente no protocolo. Mas, fazendo isso, conseguimos resumir o setup em uma única chamada de método, &lt;code&gt;setup()&lt;/code&gt;. No próximo passo veremos isso na prática.&lt;/p&gt;

&lt;p&gt;Com nosso protocolo pronto, podemos criar uma view que conforme com ele e entender melhor como essa estrutura funciona.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.3. Criando uma View com ViewCode
&lt;/h3&gt;

&lt;p&gt;Como exemplo, iremos criar uma view para a nossa &lt;code&gt;ViewController&lt;/code&gt; que tenha um texto e um botão. Para isso, iremos precisar dos elementos &lt;code&gt;UILabel&lt;/code&gt; e &lt;code&gt;UIButton&lt;/code&gt;, contidos no framework &lt;code&gt;UIKit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Primeiramente, vamos um arquivo &lt;code&gt;View.swift&lt;/code&gt; com a nossa classe &lt;code&gt;View&lt;/code&gt;, que herda as características de uma &lt;code&gt;UIView&lt;/code&gt;:&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="c1"&gt;// Arquivo View.swift&lt;/span&gt;

&lt;span class="c1"&gt;// Importamos o UIKit&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Chamamos um método da UIView para inicialização&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&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;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// O método a seguir é obrigatório na classe UIView&lt;/span&gt;
    &lt;span class="kd"&gt;required&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;coder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSCoder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;fatalError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"init(coder:) has not been implemented"&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;Agora que temos uma &lt;code&gt;View&lt;/code&gt;, podemos criar as views que serão exibidas dentro dela. Como citado anteriormente, um texto e um botão:&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="c1"&gt;// Arquivo View.swift&lt;/span&gt;

&lt;span class="c1"&gt;// Importamos o UIKit&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitleColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;button&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Chamamos um método da UIView para inicialização&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&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;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// O método a seguir é obrigatório na classe UIView&lt;/span&gt;
    &lt;span class="kd"&gt;required&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;coder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSCoder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;fatalError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"init(coder:) has not been implemented"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;labelText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;buttonTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labelText&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buttonTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&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;Talvez o trecho de código acima tenha embaralhado um pouco sua mente com tantos conceitos diferentes e talvez desconhecidos. Abaixo, algumas respostas pra perguntas que provavelmente tenham surgido:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Por quê usar o modificador de acesso &lt;code&gt;private&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para evitar que a view seja modificada. Seguindo o princípio de encapsulamento, expomos apenas o que for estritamente necessário, evitando que propriedades das nossas views sejam modificadas indevidamente. Para permitir que a view seja configurada, podemos criar um método &lt;code&gt;setup&lt;/code&gt; que tenha como parâmetros as informações necessárias.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por quê usar &lt;code&gt;lazy&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O termo &lt;em&gt;lazy&lt;/em&gt;, do inglês, descreve nossa view como "preguiçosa". E é literalmente isso que ela é. Usando essa palavra-chave definimos que o valor da nossa propriedade &lt;code&gt;label&lt;/code&gt;, por exemplo, só será definido na primeira vez que ela for acessada. E, após a definição, esse valor não poderá ser alterado. Em que contexto isso é útil? Quando temos renderização condicional. Se uma view só é adicionada caso uma condição seja atendida, evitamos que ela ocupe espaço na memória desnecessariamente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que é &lt;code&gt;label: UILabel= { /* ... */ }()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O trecho acima é chamado de &lt;em&gt;self-executing closure&lt;/em&gt;. É similar à funções anônimas em outras linguagens. Nesse caso, é como se declarássemos uma função e ela fosse chamada imediatamente. Em Swift, significa criar uma &lt;em&gt;closure&lt;/em&gt; e chamá-la logo em seguida.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para que serve &lt;code&gt;translatesAutoresizingMaskIntoConstraints&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa propriedade é definida como &lt;code&gt;false&lt;/code&gt; para permitir que as constraints que iremos definir não entrem em conflito com constraints que são geradas automaticamente pelo sistema. Assim, podemos definir nossas próprias constraints e posicionar os elementos como desejado.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por quê o método &lt;code&gt;setup(labelText:,buttonTitle:)&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para permitir configurarmos as informações da nossa &lt;code&gt;View&lt;/code&gt; sem a necessidade de expor cada uma das suas subviews. Dessa forma, limitamos a personalização a apenas o texto do label e o título do &lt;code&gt;button&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;Os conceitos acima seguem as práticas mais recomendadas para criação de views usando ViewCode. Agora que estão todos esclarecidos, podemos seguir para o próximo passo: fazer com que nossa view conforme com o protocolo &lt;code&gt;ViewCode&lt;/code&gt;.&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;extension&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewCode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;addSubviews&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;addSubview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;addSubview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setupConstraints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;NSLayoutConstraint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerXAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;centerXAnchor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerYAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;centerYAnchor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

            &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;topAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottomAnchor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerXAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;centerXAnchor&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;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setupStyle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;white&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;No trecho acima, usamos os métodos definidos no protocolo &lt;code&gt;ViewCode&lt;/code&gt; para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adicionar as views &lt;code&gt;label&lt;/code&gt; e &lt;code&gt;button&lt;/code&gt; à nossa &lt;code&gt;View&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Posicionar o &lt;code&gt;label&lt;/code&gt; centralizado horizontalmente(centerXAnchor) e verticalmente(centerYAnchor) na &lt;code&gt;View&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Posicionar o &lt;code&gt;button&lt;/code&gt; centralizado horizontalmente(centerXAnchor) e, na vertical, a um espaçamento de &lt;code&gt;8&lt;/code&gt; a partir da parte inferior(&lt;code&gt;bottomAnchor&lt;/code&gt;) do nosso &lt;code&gt;label&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Definir a cor de fundo(backgroundColor) da &lt;code&gt;View&lt;/code&gt; como branca(&lt;code&gt;.white&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, precisamos apenas chamar o setup da &lt;code&gt;View&lt;/code&gt; no &lt;code&gt;init&lt;/code&gt;:&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="c1"&gt;// Arquivo View.swift&lt;/span&gt;

&lt;span class="c1"&gt;// Importamos o UIKit&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitleColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;button&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Chamamos um método da UIView para inicialização&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&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;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// Chamamos o setup da nossa view&lt;/span&gt;
        &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// O método a seguir é obrigatório na classe UIView&lt;/span&gt;
    &lt;span class="kd"&gt;required&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;coder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSCoder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;fatalError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"init(coder:) has not been implemented"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;labelText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;buttonTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labelText&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buttonTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&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;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewCode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;addSubviews&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;addSubview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;addSubview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setupConstraints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;NSLayoutConstraint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerXAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;centerXAnchor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerYAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;centerYAnchor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

            &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;topAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottomAnchor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerXAnchor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;centerXAnchor&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;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setupStyle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;white&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;Após construir nossa &lt;code&gt;View&lt;/code&gt;, podemos usá-la na nossa &lt;code&gt;ViewController&lt;/code&gt; para ser exibida.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.4. Usando a View na ViewController
&lt;/h3&gt;

&lt;p&gt;Agora, retornamos para a nossa &lt;code&gt;ViewController&lt;/code&gt; criada anteriormente e podemos usar a &lt;code&gt;View&lt;/code&gt; para ser exibida na tela:&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="c1"&gt;// Arquivo ViewController.swift&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;myView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="c1"&gt;// Método do ciclo de vida que carrega a view&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;loadView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadView&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;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myView&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;// Configuramos a View usando o método setup&lt;/span&gt;
        &lt;span class="n"&gt;myView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;labelText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Olá, mundo!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;buttonTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Testar"&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;Esse foi o último passo para conseguirmos exibir a nossa &lt;code&gt;View&lt;/code&gt; criada utilizando o padrão &lt;code&gt;ViewCode&lt;/code&gt;. Se você executar sua aplicação, verá o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8j6wx6shxhirj180qzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8j6wx6shxhirj180qzt.png" alt="Captura de tela do simulador do iPhone 14 Pro com uma tela com fundo branco. Ao centro, um botão com os dizeres " width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, agora temos uma tela construída utilizando ViewCode. Porém, falta um último detalhe: criamos um botão, mas sem nenhuma interação. Nosso próximo passo será criar essa interação.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.5. Adicionando uma ação ao botão
&lt;/h3&gt;

&lt;p&gt;Primeiramente, vamos criar um &lt;code&gt;Delegate&lt;/code&gt; para nossa View, que é o padrão adotado dentro do próprio UIKit quando precisamos "encaminhar" uma ação/informação para fora de uma View, "delegando" a responsabilidade de lidar com ela. Iremos chamá-lo de &lt;code&gt;ViewDelegate&lt;/code&gt;:&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;ViewDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AnyObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;didTapButton&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;Algo estranho apareceu nesse trecho, né? Por quê nosso protocolo conforma com o protocolo &lt;code&gt;AnyObject&lt;/code&gt;? Para permitir que nosso delegate seja uma referência do tipo &lt;code&gt;weak&lt;/code&gt;, que só objetos podem ter, e evitando assim &lt;em&gt;retain cycles&lt;/em&gt;. Esse é um detalhe mais complexo e que não caberia nesse artigo(que já está extenso), mas é importante saber a motivação.&lt;/p&gt;

&lt;p&gt;Agora, precisamos criar uma propriedade &lt;code&gt;delegate&lt;/code&gt; na nossa &lt;code&gt;View&lt;/code&gt; e um método para lidar com a ação do nosso botão:&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;ViewDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AnyObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;didTapButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translatesAutoresizingMaskIntoConstraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitleColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;#selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;didTapButton&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;touchUpInside&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;button&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="k"&gt;weak&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewDelegate&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;

    &lt;span class="c1"&gt;// ...    &lt;/span&gt;

    &lt;span class="kd"&gt;@objc&lt;/span&gt; 
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;didTapButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;didTapButton&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;Explicando melhor o trecho acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;delegate&lt;/code&gt;: É uma propriedade com referência fraca(&lt;code&gt;weak&lt;/code&gt;) e opcional(&lt;code&gt;?&lt;/code&gt;) usada para que a &lt;code&gt;View&lt;/code&gt; consiga notificar quem a esteja usando que uma ação aconteceu, como o toque no botão&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;@objc&lt;/code&gt;: Essa propriedade do método &lt;code&gt;didTapButton&lt;/code&gt; permite que ele interaja com código em Objective-C, que é o caso de boa parte do UIKit. No caso, ele é necessário para que o método possa ser usado no &lt;code&gt;#selector&lt;/code&gt; para adicioná-lo à interação do botão&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;addTarget(_ target:, action:, for:&lt;/code&gt;): É o método usado para adicionar a ação ao botão. O primeiro parâmetro, &lt;code&gt;target&lt;/code&gt;, recebe a referência da classe onde está o método, o segundo recebe a ação em si, e para isso usamos o &lt;code&gt;#selector()&lt;/code&gt;. Por fim, no &lt;code&gt;for:&lt;/code&gt; informamos que o método será chamado para o toque dentro do botão, por isso &lt;code&gt;.touchUpInside&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feito isso, já temos toda a configuração do lado da &lt;code&gt;View&lt;/code&gt; para lidar com uma ação. Agora, falta designarmos para a ViewController a responsabilidade de processar a ação:&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;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;lazy&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;myView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;// Atribuimos a ViewController como delegate&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewDelegate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;didTapButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// Nossa ação irá atualizar a View&lt;/span&gt;
       &lt;span class="n"&gt;myView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;labelText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Sucesso!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;buttonTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Testar novamente"&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;No trecho acima, modificamos a nossa &lt;code&gt;ViewController&lt;/code&gt; para ser atribuída como &lt;code&gt;delegate&lt;/code&gt; da &lt;code&gt;View&lt;/code&gt; e para conformar com o protocolo &lt;code&gt;ViewDelegate&lt;/code&gt; para processar a ação de toque no botão. Ao tocar no botão, nossa &lt;code&gt;ViewController&lt;/code&gt; atualiza a &lt;code&gt;View&lt;/code&gt; com novas informações,  ficando assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7ifr86274nh61sx9vml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7ifr86274nh61sx9vml.png" alt="Captura de tela do simulador do iPhone 14 Pro com os dizeres " width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Conclusão
&lt;/h2&gt;

&lt;p&gt;Passando por cada etapa desse tutorial, você terá conhecimento suficiente para começar seus estudos sobre criação de telas seguindo o padrão ViewCode.&lt;/p&gt;

&lt;p&gt;O código completo desse artigo pode ser encontrado neste repositório: &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/reisdev" rel="noopener noreferrer"&gt;
        reisdev
      &lt;/a&gt; / &lt;a href="https://github.com/reisdev/viewcode-example-ios" rel="noopener noreferrer"&gt;
        viewcode-example-ios
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Repositório com o app criando neste artigo: 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Ficou com alguma dúvida? Deixe nos comentários ou me procure em alguma das minhas redes, que você encontra &lt;a href="//reisdev.com.br"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até o próximo artigo 👋🏽.&lt;/p&gt;

&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@uxstore?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;UX Store&lt;/a&gt; no &lt;a href="https://unsplash.com/photos/jJT2r2n7lYA?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>ios</category>
    </item>
    <item>
      <title>Como decodificar JSON em Swift</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Thu, 13 Jul 2023 17:08:19 +0000</pubDate>
      <link>https://dev.to/reisdev/como-decodificar-json-em-swift-2dpe</link>
      <guid>https://dev.to/reisdev/como-decodificar-json-em-swift-2dpe</guid>
      <description>&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;Para quem está iniciando, talvez esteja se perguntando: porque preciso saber decodificar um conteúdo em JSON?&lt;/p&gt;

&lt;p&gt;O formato JSON é amplamente utilizando em diversas linguagens para armazenar e transferir informações de maneira estruturada. Abaixo, alguns exemplos de cenários comuns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquivo JSON que armazena de configurações&lt;/li&gt;
&lt;li&gt;Consumir uma RESTFUL API que responda no formato JSON.&lt;/li&gt;
&lt;li&gt;String contendo informações no formato JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste artigos iremos ver como ler e decodificar o formato JSON usando a linguagem Swift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Contexto&lt;/li&gt;
&lt;li&gt;
Leitura do conteúdo JSON

&lt;ul&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Arquivo&lt;/li&gt;
&lt;li&gt;Requisição em API&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Criação do tipo em Swift&lt;/li&gt;

&lt;li&gt;Decodificação&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Leitura do conteúdo JSON
&lt;/h2&gt;

&lt;p&gt;O primeiro passo para ler um JSON em Swift é converter o seu conteúdo no formato &lt;code&gt;Data&lt;/code&gt;, um tipo da linguagem Swift, que será usado para decodificar a informação em um tipo que iremos definir mais à frente. Abaixo, temos os exemplos de conversão para cada cenário:&lt;/p&gt;

&lt;h3&gt;
  
  
  String
&lt;/h3&gt;

&lt;p&gt;Abaixo, temos um exemplo de uma string contendo uma lista de posts no formato JSON:&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="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;jsonContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""
[
  {
    "&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="s"&gt;":1,
    "&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="kt"&gt;Como&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="n"&gt;tornar&lt;/span&gt; &lt;span class="n"&gt;um&lt;/span&gt; &lt;span class="n"&gt;programador&lt;/span&gt;&lt;span class="s"&gt;",
    "&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="kt"&gt;Para&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="n"&gt;tornar&lt;/span&gt; &lt;span class="n"&gt;um&lt;/span&gt; &lt;span class="n"&gt;programador&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="n"&gt;necessário&lt;/span&gt; &lt;span class="n"&gt;estudar&lt;/span&gt; &lt;span class="n"&gt;linguagens&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;programação&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;desenvolver&lt;/span&gt; &lt;span class="n"&gt;habilidades&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;resolução&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;problemas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;",
    "&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="kt"&gt;T14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="kt"&gt;Z&lt;/span&gt;&lt;span class="s"&gt;"
  },
  {
    "&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="s"&gt;":2,
    "&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="kt"&gt;Os&lt;/span&gt; &lt;span class="n"&gt;benefícios&lt;/span&gt; &lt;span class="n"&gt;da&lt;/span&gt; &lt;span class="n"&gt;meditação&lt;/span&gt;&lt;span class="s"&gt;",
    "&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="kt"&gt;A&lt;/span&gt; &lt;span class="n"&gt;meditação&lt;/span&gt; &lt;span class="n"&gt;pode&lt;/span&gt; &lt;span class="n"&gt;ajudar&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;reduzir&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;estresse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;melhorar&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;qualidade&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;sono&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;aumentar&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;sensação&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;bem&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;estar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;",
    "&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="kt"&gt;T14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="kt"&gt;Z&lt;/span&gt;&lt;span class="s"&gt;"
  },
  {
    "&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="s"&gt;":3,
    "&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="kt"&gt;Receita&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;bolo&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;chocolate&lt;/span&gt;&lt;span class="s"&gt;",
    "&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="kt"&gt;Para&lt;/span&gt; &lt;span class="n"&gt;fazer&lt;/span&gt; &lt;span class="n"&gt;um&lt;/span&gt; &lt;span class="n"&gt;delicioso&lt;/span&gt; &lt;span class="n"&gt;bolo&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;chocolate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;você&lt;/span&gt; &lt;span class="n"&gt;vai&lt;/span&gt; &lt;span class="n"&gt;precisar&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;farinha&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;trigo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;açúcar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ovos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;óleo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cacau&lt;/span&gt; &lt;span class="n"&gt;em&lt;/span&gt; &lt;span class="n"&gt;pó&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;fermento&lt;/span&gt; &lt;span class="n"&gt;em&lt;/span&gt; &lt;span class="n"&gt;pó&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;",
    "&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="kt"&gt;T14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="kt"&gt;Z&lt;/span&gt;&lt;span class="s"&gt;"
  }
]
"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, usando as 3 aspas(&lt;code&gt;"""&lt;/code&gt;), podemos declarar uma string com múltiplas linhas. Agora, podemos fazer a conversão da nossa string para o formato &lt;code&gt;Data&lt;/code&gt;:&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="c1"&gt;// Usamos o .utf8 para converter a string&lt;/span&gt;
&lt;span class="c1"&gt;// para um padrão que permita acentuação&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonContent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Arquivo
&lt;/h3&gt;

&lt;p&gt;Supondo que tenhamos um arquivo &lt;code&gt;.json&lt;/code&gt; que contenha uma lista de artigos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Como se tornar um programador"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Para se tornar um programador, é necessário estudar linguagens de programação e desenvolver habilidades de resolução de problemas."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2023-04-18T14:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Os benefícios da meditação"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"A meditação pode ajudar a reduzir o estresse, melhorar a qualidade do sono e aumentar a sensação de bem-estar."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2023-04-18T14:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Receita de bolo de chocolate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Para fazer um delicioso bolo de chocolate, você vai precisar de farinha de trigo, açúcar, ovos, óleo, cacau em pó e fermento em pó."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2023-04-18T14:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Considerando que o nome do nosso arquivo é &lt;code&gt;artigos.json&lt;/code&gt;, ele pode ser lido da seguinte forma:&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="c1"&gt;// Caminho para um arquivo&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;forResource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"artigos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ofType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Transforma o conteúdo do arquivo em Data&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kt"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;contentsOf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usamos o &lt;code&gt;try?&lt;/code&gt; antes do inicializador do Data porque a conversão do nosso arquivo para &lt;code&gt;Data&lt;/code&gt; pode falhar e causar uma exceção. Para não termos que lidar com exceções, usamos o &lt;code&gt;try?&lt;/code&gt;, que irá fazer com que o &lt;code&gt;Data(contentsOf:)&lt;/code&gt; retorne &lt;code&gt;nil&lt;/code&gt; caso um erro ocorra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requisição em API
&lt;/h3&gt;

&lt;p&gt;Para fazer uma requisição em uma API, usaremos o método mais tradicional, &lt;code&gt;URLSession.shared.dataTask(for:)&lt;/code&gt;. Considerando uma URL fictícia que poderia nos fornecer a lista de artigos que desejamos obter, temos o seguinte código:&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="kt"&gt;URLSession&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&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;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="c1"&gt;// Verificamos se um objeto data recebido não é nulo&lt;/span&gt;
    &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// A partir daqui, executamos o passo de decodificação&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criação do tipo em Swift
&lt;/h2&gt;

&lt;p&gt;Precisamos definir a estrutura dos objetos contida no nosso JSON, para qual os dados serão decodificados. Para isso, vamos criar um &lt;code&gt;struct&lt;/code&gt; que conforme com o protocolo &lt;code&gt;Decodable&lt;/code&gt;. Esse protocolo está disponível no framework &lt;code&gt;Foundation&lt;/code&gt; e é usado para definição de objetos que sejam decodificáveis. A seguir, temos a declaração do nosso tipo &lt;code&gt;Post&lt;/code&gt;:&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;struct&lt;/span&gt; &lt;span class="kt"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Decodable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;

    &lt;span class="cm"&gt;/* 
    *  Definição dos atributos que possuem
    *  uma chave num formato diferente no JSON
    *  ex.: Nomes em snake_case
    */&lt;/span&gt;
    &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;CodingKeys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CodingKey&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;createdAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"created_at"&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;Cada atributo do objeto contido no nosso JSON é definido como uma propriedade do nosso &lt;code&gt;struct&lt;/code&gt;. Através do &lt;code&gt;enum&lt;/code&gt; &lt;code&gt;CodingKeys&lt;/code&gt; podemos definir uma associação entre chaves a serem "renomeadas" do JSON para atributos do nosso objeto. Acima, por exemplo, convertemos o &lt;code&gt;created_at&lt;/code&gt;(em &lt;em&gt;snake-case&lt;/em&gt;) para &lt;code&gt;createdAt&lt;/code&gt;(em &lt;em&gt;camel-case&lt;/em&gt;). Esse mesmo comportamento pode ser obtido atribuindo à propriedade &lt;code&gt;keyDecodingStrategy&lt;/code&gt; do &lt;code&gt;JSONDecoder&lt;/code&gt; o valor &lt;code&gt;.convertFromSnakeCase&lt;/code&gt;, que será visto no próximo tópico. O uso dessa propriedade elimina a necessidade de definirmos as associações para cada propriedade que esteja no formato &lt;em&gt;snake-case&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Com nosso &lt;em&gt;struct&lt;/em&gt; definido, poderemos fazer a decodificações de outras estruturas para ele, como um JSON, que é o nosso objetivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decodificação
&lt;/h2&gt;

&lt;p&gt;Agora que já temos um objeto &lt;code&gt;Data&lt;/code&gt; e um tipo definido podemos usá-los para decodificar nosso conteúdo JSON. Para isso, o &lt;em&gt;framework&lt;/em&gt; &lt;code&gt;Foundation&lt;/code&gt; fornece uma classe &lt;code&gt;JSONDecoder&lt;/code&gt; criada exatamente com esse objetivo. Abaixo, temos um exemplo do processo de decodificação:&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="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;decoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;JSONDecoder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;decoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keyDecodingStrategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;convertFromSnakeCase&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;artigos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;decoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="kt"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;artigos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;code&gt;decode&lt;/code&gt; da classe &lt;code&gt;JSONDecoder&lt;/code&gt; recebe dois parâmetros. O primeiro é o tipo do objeto a ser decodificado e o segundo é o objeto &lt;code&gt;Data&lt;/code&gt; que contém os dados obtidos anteriormente.&lt;/p&gt;

&lt;p&gt;No exemplo deste artigo, o tipo a ser decodificado é uma lista do tipo &lt;code&gt;Post&lt;/code&gt;. O &lt;code&gt;self&lt;/code&gt; é usado para obter o tipo esperado, que é &lt;code&gt;[Post]&lt;/code&gt;(um &lt;em&gt;array&lt;/em&gt; de &lt;code&gt;Post&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Vale ressaltar que o &lt;code&gt;Data&lt;/code&gt; esperado não pode ser nulo, então certifique-se de que seu objeto &lt;code&gt;data&lt;/code&gt; não é &lt;code&gt;nil&lt;/code&gt; antes de passá-lo para o &lt;code&gt;decode&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Conhecer essas 3 formas básicas de decodificar um JSON em Swift já te dá uma base suficiente para aplicar o conceito em diversos contextos. Abaixo, a documentação de alguns dos recursos utilizados nesse artigo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/foundation/jsondecoder" rel="noopener noreferrer"&gt;JSONDecoder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/foundation/data" rel="noopener noreferrer"&gt;Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/foundation/urlsession" rel="noopener noreferrer"&gt;URLSession&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gostou deste artigo? Compartilhe e me siga para mais conteúdos como esse!&lt;/p&gt;

&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@flowforfrank?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ferenc Almasi&lt;/a&gt; na &lt;a href="https://unsplash.com/pt-br/fotografias/HfFoo4d061A?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>beginners</category>
      <category>ios</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Optional em Swift</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Tue, 26 Apr 2022 21:17:24 +0000</pubDate>
      <link>https://dev.to/reisdev/optionals-em-swift-4lh0</link>
      <guid>https://dev.to/reisdev/optionals-em-swift-4lh0</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@lamunix?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ana Municio&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/question-mark?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;
Lidando com Optional

&lt;ul&gt;
&lt;li&gt;Force unwrapping&lt;/li&gt;
&lt;li&gt;Binding opcional&lt;/li&gt;
&lt;li&gt;Unwrapping implícito&lt;/li&gt;
&lt;li&gt;Encadeamento opcional&lt;/li&gt;
&lt;li&gt;Unwrapping incondicional&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusão&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;É possível criar variáveis em Swift que não necessariamente tenham um valor definido(ou seja, nulo) e elas são conhecidas como opcionais. Para que uma variável não tenha valor usamos o valor &lt;code&gt;nil&lt;/code&gt;. Definimos uma variável como opcional colocando uma interrogação após a definição do seu tipo, da seguinte forma:&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;minhaString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minhaString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Saída: nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir dessa atribuição, a variável &lt;code&gt;minhaString&lt;/code&gt; ainda não tem valor definido. Agora, podemos tentar atribuir um valor à &lt;code&gt;minhaString&lt;/code&gt; e verificar o resultado:&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;minhaString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá mundo!"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minhaString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Saída: Optional("Olá mundo!")&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lidando com &lt;code&gt;Optional&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Lidar com variáveis opcionais requer um pouco mais de atenção, pois é importante verificar se essa variável possui valor antes de utilizá-lo em algum trecho de código. Para isso, temos 4 opções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usando o force unwrapping, com &lt;code&gt;!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usando binding opcional, com &lt;code&gt;if let&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usando o unwrapping implícito de opcionais, com &lt;code&gt;!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usando encadeamento opcional, com &lt;code&gt;a?.b?.c&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usando unwrapping incondicional&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Force unwrapping
&lt;/h3&gt;

&lt;p&gt;Force unwrapping, que pode ser traduzido como "forçar a desembrulhar" é a forma explicita de extrair o valor de um &lt;code&gt;Optional&lt;/code&gt;. Ele pode ser usado, por exemplo, em um parâmetro de uma função que não pode ser &lt;code&gt;nil&lt;/code&gt;, dessa forma:&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="c1"&gt;// O parâmetro 'nome' não é opcional&lt;/span&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;minhaFuncao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// A variável 'meuNome'é opcional e tem valor 'nil'&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuNome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;

&lt;span class="nf"&gt;minhaFuncao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meuNome&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O trecho abaixo dispararia a seguinte exceção:&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="kt"&gt;Unexpectedly&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;unwrapping&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="kt"&gt;Optional&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por quê? Pelo fato de que o valor da variável &lt;code&gt;meuNome&lt;/code&gt; foi atribuído como &lt;code&gt;nil&lt;/code&gt;. Portanto, é importante ter em mente que, para usar o force unwrapping, é necessário atender pelo menos um dos seguintes critérios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ter certeza de que o valor está definido&lt;/li&gt;
&lt;li&gt;Tratar a exceção que será lançada caso o valor seja &lt;code&gt;nil&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se o valor da variável &lt;code&gt;meuNome&lt;/code&gt; não fosse &lt;code&gt;nil&lt;/code&gt;, o resultado seria diferente:&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;minhaFuncao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&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;var&lt;/span&gt; &lt;span class="nv"&gt;meuNome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ReisDev"&lt;/span&gt;

&lt;span class="nf"&gt;minhaFuncao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meuNome&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Saída: "Olá, ReisDev"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O uso do force unwrapping não é recomendado por conta dos erros que ele pode ocasionar caso alguma variável tenha o valor &lt;code&gt;nil&lt;/code&gt;. Por isso, use com cautela.&lt;/p&gt;

&lt;h3&gt;
  
  
  Binding opcional
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;if let&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Optional binding, que pode ser traduzido como "amarração opcional", consiste em garantir que um trecho de código será executado apenas se um determinado valor não for &lt;code&gt;nil&lt;/code&gt;. Inclusive, é possível verificar sub-condições, como atributos de objetos. Abaixo, um exemplo de uso:&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meuTexto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* 
     * Nesse contexto, a variável texto é
     * do tipo String, e não 'String?'
     */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No bloco de código acima, o trecho contido entre as chaves é chamado de &lt;code&gt;closure&lt;/code&gt;, e você pode ver mais detalhes &lt;a href="https://docs.swift.org/swift-book/LanguageGuide/Closures.html" rel="noopener noreferrer"&gt;neste link&lt;/a&gt;(em inglês). Dentro dessa closure a variável &lt;code&gt;texto&lt;/code&gt;(que recebeu o valor da variável &lt;code&gt;meuTexto&lt;/code&gt;) é do tipo &lt;code&gt;String&lt;/code&gt; por conta da amarração opcional. Se o valor da variável &lt;code&gt;meuTexto&lt;/code&gt; não for &lt;code&gt;nil&lt;/code&gt;, ele será "amarrado" à variável &lt;code&gt;texto&lt;/code&gt;, e o trecho de código dentro da closure será executado.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;guard let&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Além do &lt;code&gt;if let&lt;/code&gt;, podemos usar também o &lt;code&gt;guard let&lt;/code&gt;, que valida se uma variável tem valor e, caso não tenha, executa um trecho de código que deve encerrar a execução, seja do programa ou de uma função. Abaixo, um exemplo:&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;validaTexto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meuTexto&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Valida o texto ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unwrapping implícito
&lt;/h3&gt;

&lt;p&gt;O unwrapping implícito, que pode ser traduzido como "desembrulhamento" implícito, é usado para evitar ter que usar as outras abordagens citadas nesse artigo para obter o valor de uma variável &lt;code&gt;Optional&lt;/code&gt;. Ele funciona da seguinte forma:&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como a variável &lt;code&gt;pessoa&lt;/code&gt; é do tipo &lt;code&gt;Pessoa?&lt;/code&gt; (sem o unwrapping implícito), se tentarmos acessar o atributo &lt;code&gt;endereco&lt;/code&gt;, por exemplo, obteríamos o seguinte erro:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;value of optional type 'Pessoa?' must be unwrapped to refer to member 'endereco' of wrapped base type 'Pessoa'&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por quê? O compilador da linguagem sabe que é arriscado acessar uma variável &lt;code&gt;Optional&lt;/code&gt; sem a garantia de que ela de fato tem um valor, pois isso pode causar um erro. Por isso, ele tenta garantir que quem está escrevendo o código faça essa verificação.&lt;/p&gt;

&lt;p&gt;O unwrapping implícito é usado exatamente para não precisar fazer essa verificação todas as vezes. Parece prático, mas também pode ser arriscado. Se você utilizar esse recurso, tenha o cuidado de tratar exceções, pois pode acontecer de sua variável ter o valor  &lt;code&gt;nil&lt;/code&gt;, e isso irá ocasionar em um erro. O uso desse recurso não é encorajado, por conta dos problemas que ele pode gerar. Por isso,&lt;b&gt; Use com moderação&lt;/b&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encadeamento opcional
&lt;/h3&gt;

&lt;p&gt;Optional chaining, que pode ser traduzido como "encadeamento opcional", é usado, por exemplo, quando se tem atributos de objetos que podem ser nulos, e esses objetos também tem atributos que podem ser nulos. Abaixo, um exemplo:&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;minhaRua&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rua&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O objeto pessoa é do tipo &lt;code&gt;Pessoa?&lt;/code&gt;, e o objeto pessoa possui um atributo &lt;code&gt;endereco&lt;/code&gt; do tipo &lt;code&gt;Endereco?&lt;/code&gt;. A variável &lt;code&gt;minhaRua&lt;/code&gt; também será do tipo &lt;code&gt;Optional&lt;/code&gt;, e ela receberá um valor somente se o objeto &lt;code&gt;pessoa&lt;/code&gt; e seu aributo &lt;code&gt;endereco&lt;/code&gt; não forem &lt;code&gt;nil&lt;/code&gt;. Caso algum deles tenha valor nulo, a variável &lt;code&gt;minhaRua&lt;/code&gt; também terá valor &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unwrapping incondicional
&lt;/h3&gt;

&lt;p&gt;Unconditional unwrapping, que pode ser traduzido como "desembrulhamento incondicional", é usado quando você tem certeza de que um &lt;code&gt;Optional&lt;/code&gt; contém um valor. Abaixo, um exemplo:&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"42"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Saída: 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No trecho acima, o inicializador de &lt;code&gt;Int&lt;/code&gt; pode falhar, pois a string fornecida pode não conter um número. Porém, nós temos certeza de que &lt;code&gt;"42"&lt;/code&gt; irá resultar em um número. Logo, podemos usar o unconditional unwrapping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Agora você já sabe como funcionam as variáveis do tipo &lt;code&gt;Optional&lt;/code&gt; e as diferentes maneiras como você pode lidar com elas. Lembre-se sempre de avaliar a forma mais adequada de tratar variáveis opcionais em cada situação. Caso queira saber mais detalhes, recomendo que leia a &lt;a href="https://developer.apple.com/documentation/swift/optional" rel="noopener noreferrer"&gt;documentação da Apple&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Compartilhe e me siga para mais conteúdos como esse!&lt;/p&gt;

&lt;p&gt;Minhas redes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://blog.reisdev.com.br" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; | &lt;a href="https://github.com/reisdev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://linkedin.com/in/matheus-dos-reis-de-jesus" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Até a próxima!👋🏽&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Variáveis e Constantes em Swift</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Wed, 13 Apr 2022 15:12:23 +0000</pubDate>
      <link>https://dev.to/reisdev/variaveis-e-constantes-em-swift-1ddm</link>
      <guid>https://dev.to/reisdev/variaveis-e-constantes-em-swift-1ddm</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@blakeconnally?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Blake Connally&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/programming?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;
Declarando constantes e variáveis

&lt;ul&gt;
&lt;li&gt;Constantes&lt;/li&gt;
&lt;li&gt;Variáveis&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Definindo o tipo&lt;/li&gt;

&lt;li&gt;Atribuindo valores&lt;/li&gt;

&lt;li&gt;Conclusão&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Uma das primeiras coisas para se conhecer ao aprender uma nova linguagem é o funcionamento das constantes e variáveis. Esse artigo traz uma breve explicação deste conceito dentro da linguagem Swift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declarando constantes e variáveis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Constantes
&lt;/h3&gt;

&lt;p&gt;Para se declarar uma constante usamos a palavra-chave &lt;code&gt;let&lt;/code&gt;. Como o próprio nome sugere, constantes não podem ter seu valor alterado. Quando declaradas, seu valor é atribuído e não poderá ser modificado. Abaixo, um exemplo:&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="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;helloWorld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello world!"&lt;/span&gt;

&lt;span class="c1"&gt;// Tentando atribuir um novo valor:&lt;/span&gt;
&lt;span class="n"&gt;helloWorld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Novo valor"&lt;/span&gt;

&lt;span class="cm"&gt;/*
* Irá resultar em um erro:
* "Cannot assign to value: ‘helloWorld’ is a ‘let’ constant"
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como descrito no bloco de código acima, tentar atribuir outro valor à uma constante irá causar um erro. Então, lembre-se: a palavra chave &lt;code&gt;let&lt;/code&gt; só deve ser usada quando o valor for constante. Inclusive, a própria documentação da linguagem recomenda que se use &lt;code&gt;let&lt;/code&gt; sempre que possível.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variáveis
&lt;/h3&gt;

&lt;p&gt;Para se declarar uma variável usamos a palavra-chave &lt;code&gt;var&lt;/code&gt;. Sempre que for preciso armazenar um valor que pode mudar durante a execução de um código, deve-se usar &lt;code&gt;var&lt;/code&gt;. É possível, inclusive, declarar mais de uma variável em uma mesma linha. Abaixo, temos alguns exemplos:&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="c1"&gt;// Declarações únicas&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;valido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Este é um texto"&lt;/span&gt;

&lt;span class="c1"&gt;// Declarações múltiplas&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;string1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Primeira string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Segunda string"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Definindo o tipo
&lt;/h2&gt;

&lt;p&gt;A linguagem Swift permite que sejam definidos tipos para variáveis e constantes(apesar de não ser obrigatório), e escrevemos da seguinte forma:&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="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Este é um texto"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;contador&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;medida&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;hoje&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A linguagem Swift possui os tipos básicos, como tupla, array e dicionário. Os demais tipos são providos pelo framework &lt;code&gt;Foundation&lt;/code&gt;, criado pela própria Apple. Você pode ver os tipos com mais detalhes &lt;a href="https://developer.apple.com/documentation/foundation" rel="noopener noreferrer"&gt;neste link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Além dos exemplos acima, uma variável/constante também pode ser do tipo &lt;code&gt;Optional&lt;/code&gt;, que é usado quando o valor pode ser indefinido, dessa forma:&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="c1"&gt;// Valor "nil" explícito&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;

&lt;span class="c1"&gt;// Valor "nil" implícito&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A palavra-chave &lt;code&gt;nil&lt;/code&gt; é similar ao &lt;code&gt;null&lt;/code&gt; em outras linguagens, usada para indicar um valor nulo. O tipo &lt;code&gt;Optional&lt;/code&gt; possui muitos detalhes que serão explicados em outro artigo. Neste, iremos nos limitar apenas a saber que é possível utilizá-lo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atribuindo valores
&lt;/h2&gt;

&lt;p&gt;Para atribuir valores, sua variável/constante pode ter um tipo definido ou não. Se ela tiver, o valor atribuído deve ser do mesmo tipo da variável.&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="c1"&gt;// Com tipo definido:&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Esse é um texto"&lt;/span&gt;

&lt;span class="c1"&gt;// Sem tipo definido&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Esse é um texto"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você não definir um tipo, o compilador irá considerar o tipo do valor atribuído. No caso acima, o tipo seria String.&lt;/p&gt;

&lt;p&gt;Quando a variável/constante possui um tipo definido, o valor que for atribuído deverá ser desse mesmo tipo.&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="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;meuTexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como o valor atribuído acima é do tipo inteiro, mas o tipo da variável &lt;code&gt;meuTexto&lt;/code&gt; é String, esse trecho irá disparar uma exceção:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;error: cannot convert value of type 'Int' to specified type 'String'&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A própria linguagem já previne que você cometa erros ao atribuir valores de tipos diferentes do que foi definido para uma determinada variável/constante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Agora você já conhece o básico sobre o uso de variáveis e constantes em Swift. Recomendo que veja a &lt;a href="https://docs.swift.org/swift-book/ReferenceManual/Types.html" rel="noopener noreferrer"&gt;documentação da linguagem&lt;/a&gt; e também do &lt;a href="https://developer.apple.com/documentation/foundation" rel="noopener noreferrer"&gt;framework Foundation&lt;/a&gt; sobre os diferentes tipos disponíveis.&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Compartilhe e me siga para mais conteúdos como esse!&lt;/p&gt;

&lt;p&gt;Minhas redes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://blog.reisdev.com.br" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; | &lt;a href="https://github.com/reisdev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://linkedin.com/in/matheus-dos-reis-de-jesus" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Até a próxima!👋🏽&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>swift</category>
      <category>beginners</category>
      <category>ios</category>
    </item>
    <item>
      <title>Como escrever códigos mais padronizados?</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Sun, 10 Oct 2021 00:13:32 +0000</pubDate>
      <link>https://dev.to/reisdev/como-escrever-codigos-mais-padronizados-5hm0</link>
      <guid>https://dev.to/reisdev/como-escrever-codigos-mais-padronizados-5hm0</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@timgraf99?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Tim Graf&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/guide?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;O que é Style Guide?&lt;/li&gt;
&lt;li&gt;Quem define um guia de estilo?&lt;/li&gt;
&lt;li&gt;No que isso vai me ajudar?&lt;/li&gt;
&lt;li&gt;Exemplos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Quem me acompanha nas redes sociais sabe que, recentemente(junho de 2019), eu mudei o rumo da minha carreira. Estava trabalhando com Data Science e decidi focar no desenvolvimento mobile iOS. A partir disso, tive que me dedicar a aprender Swift, linguagem lançada pela Apple em 2014.&lt;/p&gt;

&lt;p&gt;Para aprender novas linguagens, é necessário conhecer padrões: sintaxe, comandos, paradigmas e por aí vai. Um detalhe muito importante é: Qual o padrão para se escrever códigos na linguagem que estou aprendendo? Para isso existem os style guides.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Style Guide?
&lt;/h2&gt;

&lt;p&gt;Em português, Guia de Estilo, é um conjunto de regras que definem como devem ser escritas as mais variadas instruções em uma determinada linguagem. Essas regras envolvem preferências sobre, por exemplo, iniciar ou não uma nova linha antes de das chaves de um comando &lt;code&gt;if&lt;/code&gt;. Um exemplo de regra a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Preferido&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;//code&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Não preferido (lógico, um crime)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;//code&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os style guides são criados para (tentar) garantir que o código terá um mesmo formato, independentemente de quem escreveu, tornando mais fácil sua leitura por qualquer pessoa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quem define um guia de estilo?
&lt;/h2&gt;

&lt;p&gt;Os guias de estilo podem ser definidos por um projeto, empresa, comunidade, etc. Por exemplo, dentro de uma empresa, é possível que diferentes projetos sigam diferentes guias, cada um adequado às suas necessidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  No que isso vai me ajudar?
&lt;/h2&gt;

&lt;p&gt;Conhecer um guia de estilo pode tirar muitas dúvidas sobre como um "bom código" deve ser escrito. Você irá conhecer e entender como formatar determinados comandos, como escrever expressões, onde colocar ou não espaços, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;p&gt;Abaixo estão listados alguns exemplos de guias de estilo para você conhecer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-0008/" rel="noopener noreferrer"&gt;PEP-8: Style Guide oficial de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php-fig.org/psr/psr-12/" rel="noopener noreferrer"&gt;PSR-12: Coding Style Guide de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/styleguide/javaguide.html" rel="noopener noreferrer"&gt;Java Style Guide da Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/styleguide/csharp-style.html" rel="noopener noreferrer"&gt;C# Style Guide da Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/javascript" rel="noopener noreferrer"&gt;Javascript Style Guide da AirBnb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart.dev/guides/language/effective-dart/style" rel="noopener noreferrer"&gt;Dart Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raywenderlich/swift-style-guide" rel="noopener noreferrer"&gt;Swift Style Guide da comunidade Ray wenderlich&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>codequality</category>
      <category>braziliandevs</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Tratamento de Exceção com erros customizados em Swift</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Tue, 27 Apr 2021 12:20:29 +0000</pubDate>
      <link>https://dev.to/reisdev/tratamento-de-excecao-com-erros-customizados-em-swift-403b</link>
      <guid>https://dev.to/reisdev/tratamento-de-excecao-com-erros-customizados-em-swift-403b</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@sigmund?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Sigmund&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/error?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizar erros customizados pode deixar seu código mais compreensível e organizado, pois adiciona uma "descrição" para determinadas situações que podem ocorrer. No artigo de hoje vamos ver como criar e tratar erros customizados na linguagem Swift.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sumário
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Criação&lt;/li&gt;
&lt;li&gt;Tratamento de Exceção&lt;/li&gt;
&lt;li&gt;Considerações&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Criação
&lt;/h1&gt;

&lt;p&gt;Primeiro, precisamos pensar em um contexto para criar nossos erros. Vamos supor que existe um serviço que consome uma API que fornece dados sobre filmes, e iremos tratar os possíveis erros. Os erros mais comuns são: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recurso não encontrado(404)&lt;/li&gt;
&lt;li&gt;Proibido(403)&lt;/li&gt;
&lt;li&gt;Erro interno(500)&lt;/li&gt;
&lt;li&gt;Serviço Indisponível(503)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os números associados aos erros são conhecidos como "Código de Status HTTP"(HTTP Status Code).&lt;/p&gt;

&lt;p&gt;No trecho de código abaixo, iremos criar nossos erros customizados:&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;enum&lt;/span&gt; &lt;span class="kt"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;NotFound&lt;/span&gt;           &lt;span class="c1"&gt;// Recurso não encontrado&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;Forbidden&lt;/span&gt;          &lt;span class="c1"&gt;// Proibido&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;InternalError&lt;/span&gt;      &lt;span class="c1"&gt;// Erro interno&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;ServiceUnavailable&lt;/span&gt; &lt;span class="c1"&gt;// Indisponível&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usamos uma estrutura do tipo &lt;code&gt;enum&lt;/code&gt; para definir o conjunto de erros que temos. Para dar continuidade, iremos supor que nosso serviço dispara exceções com os tipos definidos acima quando os respectivos códigos de status HTTP são recebidos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tratamento de Exceção
&lt;/h1&gt;

&lt;p&gt;Agora que já temos um conjunto definido de erros, vamos ver como tratar nossas exceções. A linguagem Swift usa, para tratamento de exceções, uma estrutura conhecida como &lt;code&gt;do-try-catch&lt;/code&gt;, que é escrita da seguinte forma:&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="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nf"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// Tratamento da exceção&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adequando o código acima para nosso cenário do serviço de filmes, e supondo que o serviço já está implementado, teríamos o seguinte:&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="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Tenta obter os dados do filme de id 5201&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;MovieService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5201&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nf"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// Trata os erros&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ir um pouco além do que já vimos. A estrutura do-try-catch permite que tratemos diferentes tipos de exceções, como se fosse um switch-case, da seguinte forma:&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="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Tenta obter os dados do filme de id 5201&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;MovieService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5201&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="kt"&gt;APIError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;NotFound&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Trata o erro de "Recurso não encontrado&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="kt"&gt;APIError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Forbidden&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Trata o erro de "Proibido"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="kt"&gt;APIError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;InternalError&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Trata o erro de "Erro interno&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="kt"&gt;APIError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;ServiceUnavailable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Trata o erro de "Serviço Indisponível"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com a estrutura acima, conseguimos tratar alguns dos erros mais comuns que podem ocorrer ao fazer uma requisição a um servidor. Vale destacar que não necessariamente essa é a melhor abordagem, mas ela é um bom exemplo de como tratar erros customizados usando a linguagem Swift.&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerações
&lt;/h1&gt;

&lt;p&gt;Caso você tenha interesse em descobrir mais sobre tratamento de exceções em Swift, você pode ler a &lt;a href="https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;. Espero que essa explicação tenha te ajudado!&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Me siga para mais conteúdos como esse!&lt;/p&gt;

&lt;p&gt;Minhas redes sociais:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Até a próxima!👋🏽&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como usar variáveis de ambiente sem biblioteca em React</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Tue, 20 Apr 2021 11:01:38 +0000</pubDate>
      <link>https://dev.to/reisdev/como-usar-variaveis-de-ambiente-sem-biblioteca-em-react-1ce6</link>
      <guid>https://dev.to/reisdev/como-usar-variaveis-de-ambiente-sem-biblioteca-em-react-1ce6</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@flyd2069?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;FLY:D&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/key-security?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já deixou vazar alguma chave de segurança porque subiu alguma alteração e esqueceu de apagar o conteúdo sensível? Usar variáveis de ambiente evita que coisas assim aconteçam. Mas, como elas funcionam no React? Vem comigo!&lt;/p&gt;

&lt;h1&gt;
  
  
  Sumário
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.too-que-s%C3%A3o-vari%C3%A1veis-de-ambiente"&gt;O que são Variáveis de ambiente&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Como funcionam&lt;/li&gt;
&lt;li&gt;Como utilizar&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  O que são Variáveis de Ambiente
&lt;/h1&gt;

&lt;p&gt;Variáveis de ambiente são um conjunto de valores que geralmente são definidos para configurações de uma aplicação. Exemplos: Dados de conexão com um banco, a URL de uma API e etc.&lt;/p&gt;

&lt;p&gt;O termo "Ambientes" se refere à diferentes cenários em que uma aplicação pode estar sendo executada. Os mais comuns são: desenvolvimento, teste, homologação, e produção. Cada um deles pode exigir diferentes configurações, e por isso é feita essa divisão. Você uma variável na aplicação que, em diferentes ambientes, terá valores específicos para aquele cenário.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como funcionam
&lt;/h1&gt;

&lt;p&gt;Para configurar variáveis de ambiente em uma aplicação React você precisa criar um arquivo na raiz da aplicação com o nome &lt;code&gt;.env&lt;/code&gt;. Primeiro, certifique-se de que está na pasta-raiz do seu projeto, onde ficam os arquivos &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;.gitignore&lt;/code&gt; e etc. Se preferir criar por linha de comando, utilize um dos comandos abaixo, de acordo com seu sistema operacional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# MacOS ou UNIX&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;pasta-do-projeto
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .env

&lt;span class="c"&gt;# Windows&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;pasta-do-projeto
&lt;span class="nb"&gt;type &lt;/span&gt;NUL &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, você verá o arquivo vazio na pasta-raiz do seu projeto. Para criar uma variável de ambiente, você deve utilizar o prefixo &lt;code&gt;REACT_APP_&lt;/code&gt;. Por exemplo: Se você deseja criar uma variável &lt;code&gt;API_URL&lt;/code&gt;, ela deve ser nomeada como &lt;code&gt;REACT_APP_API_URL&lt;/code&gt;, pois a &lt;code&gt;react-scripts&lt;/code&gt; só faz a leitura das variáveis que usam esse prefixo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como utilizar
&lt;/h1&gt;

&lt;p&gt;Vamos supor uma aplicação que precise de variáveis de ambiente para usar uma API para usar com o Axios. Não se preocupe com o que é axios e o que API, foque em entender a parte das variáveis. Será preciso configurar a porta, a url base e a versão de uma API. Logo, nosso arquivo &lt;code&gt;.env&lt;/code&gt; ficaria da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Arquivo .env&lt;/span&gt;
&lt;span class="nv"&gt;REACT_APP_API_BASEURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://mydomain.com
&lt;span class="nv"&gt;REACT_APP_API_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8888
&lt;span class="nv"&gt;REACT_APP_API_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora, para configurar nossa instância do Axios, podemos utilizar nossas variáveis de ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Arquivo axios.js, apenas um exemplo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_API_BASEURL&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_API_PORT&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_API_VERSION&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/`&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E pronto. Nossas variáveis de ambiente estão configuradas e prontas para serem utilizadas em toda a aplicação. Porém, ainda temos dois pontos importantes:&lt;/p&gt;

&lt;p&gt;Para evitar que seu arquivo &lt;code&gt;.env&lt;/code&gt; seja enviado para um repositório remoto, é importante adicioná-lo ao &lt;code&gt;.gitignore&lt;/code&gt;,dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Arquivo .gitignore&lt;/span&gt;
&lt;span class="c"&gt;# ... outros valores&lt;/span&gt;
.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E, para garantir que outras pessoas saberão configurar as variáveis de ambiente, crie um arquivo &lt;code&gt;.env.example&lt;/code&gt;, com as variáveis sem valor definido, dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Arquivo .env.example&lt;/span&gt;
&lt;span class="nv"&gt;REACT_APP_API_BASEURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://mydomain.com
&lt;span class="nv"&gt;REACT_APP_API_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8888
&lt;span class="nv"&gt;REACT_APP_API_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Considerações
&lt;/h1&gt;

&lt;p&gt;É importante lembrar que variáveis de ambiente configuradas em containers e ambientes cloud(Heroku, Vercel, Netlify, etc) também são reconhecidas, em tempo de build. Agora que você já sabe disso, não vai mais precisar se preocupar em apagar valore sensíveis toda vez que for fazer algum commit.&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Me siga para mais conteúdos como esse!&lt;/p&gt;

&lt;p&gt;Minhas redes sociais:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Até o próximo artigo!👋🏽&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>security</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Nullish Coalescing Operator (??) on Javascript</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Tue, 13 Apr 2021 13:04:59 +0000</pubDate>
      <link>https://dev.to/reisdev/nullish-coalescing-operator-3jgl</link>
      <guid>https://dev.to/reisdev/nullish-coalescing-operator-3jgl</guid>
      <description>&lt;p&gt;Cover by &lt;a href="https://unsplash.com/@evan__bray?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Evan Dennis&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/question-mark?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Intro&lt;/li&gt;
&lt;li&gt;The operator ??&lt;/li&gt;
&lt;li&gt;Use case&lt;/li&gt;
&lt;li&gt;Considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;You may have seen a Javascript piece of code like this before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;actualValue&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;defaultValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The operator &lt;code&gt;||&lt;/code&gt; used above is called "Logic OR", and works this way: If the value at the left of the operator is true, its value will be assigned to the variable &lt;code&gt;value&lt;/code&gt;. If it is false, then the variable &lt;code&gt;value&lt;/code&gt; will receive the value at the right, &lt;code&gt;"defaultValue"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you're used to Javascript, you must know that there are various problems with false and true values. Example: &lt;code&gt;""&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt; are considered false values. Then, if in an algorithm &lt;code&gt;""&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt; are considered valid values, the operator &lt;code&gt;||&lt;/code&gt; wouldn't give the desired result. That's when the Nullish Coalescing operator comes.&lt;/p&gt;

&lt;h1&gt;
  
  
  The operator &lt;code&gt;??&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Now that you understand the problem, comes the solution. The Nullish Coalescing operator is represented by the symbols &lt;code&gt;??&lt;/code&gt; and is used like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;actualValue&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;defaultValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, if the value of &lt;code&gt;actualValue&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;, the value &lt;code&gt;"defautlValue"&lt;/code&gt; will be assigned to the variable &lt;code&gt;value&lt;/code&gt;. Otherwise, the value &lt;code&gt;actualValue&lt;/code&gt; will be assigned to it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Use case
&lt;/h1&gt;

&lt;p&gt;Think about this scenario: You're creating a function that evaluates a expression using a coefficient. If the coefficient isn't provided, it will receive a default value, with &lt;code&gt;0&lt;/code&gt; being valid. As I've said before, the operator &lt;code&gt;||&lt;/code&gt; would not be the best for this case. Then, the operator &lt;code&gt;??&lt;/code&gt; is much more suitable. Check the representation of this problem below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;coefficient&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;coefficient&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3.5 ( 2 + 3 * 0,5 )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function &lt;code&gt;calculateResult&lt;/code&gt; uses the &lt;code&gt;??&lt;/code&gt; to check if the parameter &lt;code&gt;coefficient&lt;/code&gt; is provided. If it is, then the value will be taken. Otherwise, the default coefficient will be &lt;code&gt;0.5&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerations
&lt;/h1&gt;

&lt;p&gt;The case used was a simple example, but the operator &lt;code&gt;??&lt;/code&gt; can be useful in a lot of situations and assure more reliability to your code.&lt;/p&gt;

&lt;p&gt;Enjoyed this article? Follow me for more contents like this one!&lt;/p&gt;

&lt;p&gt;Follow me:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;See you on the next article!👋🏽&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>node</category>
    </item>
    <item>
      <title>Operador de Nullish Coalescing (??) em Javascript</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Mon, 12 Apr 2021 12:08:06 +0000</pubDate>
      <link>https://dev.to/reisdev/js-operador-nullish-coalescing-2g35</link>
      <guid>https://dev.to/reisdev/js-operador-nullish-coalescing-2g35</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@evan__bray?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Evan Dennis&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/question-mark?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Sumário
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;O operador ??&lt;/li&gt;
&lt;li&gt;Caso de uso&lt;/li&gt;
&lt;li&gt;Considerações&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Talvez em algum momento você tenha se deparado com um trecho de código em Javascript da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valorReal&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;valorPadrão&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O operador &lt;code&gt;||&lt;/code&gt; usado acima é chamado de OU lógico, e funciona da seguinte maneira: Se o valor à esquerda do operador for verdadeiro, seu valor será atribuído à variável &lt;code&gt;valor&lt;/code&gt;. Se o seu valor for falso, a variável &lt;code&gt;valor&lt;/code&gt; receberá o valor à direta, "valorPadrão".&lt;/p&gt;

&lt;p&gt;Se você já está habituado com Javascript, deve saber que existem vários problemas com relação a falsidade ou veracidade de valores na linguagem. Exemplo: "" e 0 são considerados valores falsos. Logo, se em um algoritmo "" ou 0 forem valores válidos, o operador &lt;code&gt;||&lt;/code&gt; não iria fornecer o resultado necessário. É aí que entra o operador de Coalescência Nula(ou Nullish Coalescing).&lt;/p&gt;

&lt;h1&gt;
  
  
  O operador &lt;code&gt;??&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Agora que você já entendeu o problema, vêm a solução. O operador de Coalescência Nula é representado por &lt;code&gt;??&lt;/code&gt; e utilizado da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valorReal&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;valorPadrão&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, se o valor da variável &lt;code&gt;valorReal&lt;/code&gt; for &lt;code&gt;null&lt;/code&gt; ou &lt;code&gt;undefined&lt;/code&gt;, a variável &lt;code&gt;valor&lt;/code&gt; receberá &lt;code&gt;"valorPadrão"&lt;/code&gt;. Caso contrário, ela receberá o valor de &lt;code&gt;valorReal&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Caso de Uso
&lt;/h1&gt;

&lt;p&gt;Pense no seguinte cenário: Você está fazendo um cálculo que utiliza um coeficiente. Se o coeficiente não for fornecido, ele irá receber um valor padrão, sendo &lt;code&gt;0&lt;/code&gt; um valor válido. Como comentei, o operador &lt;code&gt;||&lt;/code&gt; iria impedir que o &lt;code&gt;0&lt;/code&gt; fosse utilizado. Nesse caso, o operador &lt;code&gt;??&lt;/code&gt; se torna muito útil. Confira a representação desse problema abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calcularResultado&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;coeficiente&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;coeficiente&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculaResultado&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 3.5 ( 2 + 3 * 0,5 )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;calculaResultado&lt;/code&gt; usa o &lt;code&gt;??&lt;/code&gt; para verificar se o parâmetro &lt;code&gt;coeficiente&lt;/code&gt; foi passado para a função. Caso tenha sido, seu valor será usado. Se não, o coeficiente padrão será &lt;code&gt;0.5&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerações
&lt;/h1&gt;

&lt;p&gt;O caso que citei for um exemplo simples, mas o operador &lt;code&gt;??&lt;/code&gt; pode ser útil em muitas situações e garantir uma maior confiabilidade no seu código.&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Me siga para mais conteúdos como esse!&lt;/p&gt;

&lt;p&gt;Minhas redes sociais:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Até o próximo artigo!👋🏽&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>O que preciso saber para aprender React?</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Thu, 08 Apr 2021 20:13:06 +0000</pubDate>
      <link>https://dev.to/reisdev/o-que-preciso-saber-para-aprender-react-1cag</link>
      <guid>https://dev.to/reisdev/o-que-preciso-saber-para-aprender-react-1cag</guid>
      <description>&lt;p&gt;Capa por &lt;a href="https://unsplash.com/@casparrubin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Caspar Camille Rubin&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/react.js?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meu primeiro contato com React, na Semana de Informática da UFV, foi uma experiência traumática. Eu não entendia nada, mesmo sabendo programar. As linhas de código não faziam sentido. Era Redux, React Router, Classes, ComponentDidIsso, ComponentDidAquilo. Levei mais de 1 ano pra ter coragem de tentar aprender novamente.&lt;/p&gt;

&lt;p&gt;Pelo que tenho visto no Twitter e em várias comunidades, as dificuldades de outras pessoas são as mesmas que eu tive. Então, para evitar que enfrentem a mesma dificuldade que eu, vamos ao que interessa.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sumário
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;HTML e CSS&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;li&gt;Programação Funcional&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  HTML e CSS
&lt;/h2&gt;

&lt;p&gt;Parece simples, né? Mas saber HTML e CSS faz muita diferença. Conhecer qual o propósito de cada elemento que pode ser usado num código HTML impacta diretamente na qualidade da sua aplicação. Um HTML e CSS bem construído impactam diretamente na Acessibilidade, SEO, legibilidade e experiência do usuário. Usar divs(ou tables 😬) está longe das melhores práticas.&lt;/p&gt;

&lt;p&gt;Onde encontro conteúdo?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/html" rel="noopener noreferrer"&gt;W3Schools - HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/css" rel="noopener noreferrer"&gt;W3Schools - CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://html.com" rel="noopener noreferrer"&gt;HTML.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learnlayout.com" rel="noopener noreferrer"&gt;LearnLayout - CSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Javascript
&lt;/h2&gt;

&lt;p&gt;Esse aqui é indispensável. Quando comecei a aprender React, eu não sabia Javascript, então tive muita dificuldade em entender a sintaxe, funções anônimas, os problemas com tipos e alguns operadores. Se eu soubesse JS antes de tentar aprender React, esse processo certamente teria sido bem mais simples e menos traumático.&lt;/p&gt;

&lt;p&gt;Do meu ponto de vista, os principais pontos da linguagem são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AJAX (Fetch, async/await e Promises)&lt;/li&gt;
&lt;li&gt;Spread Operator&lt;/li&gt;
&lt;li&gt;Strict equality vs Loose equality&lt;/li&gt;
&lt;li&gt;Entender como "undefined" funciona&lt;/li&gt;
&lt;li&gt;Object e Array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se tiver conhecimentos sólidos sobre o que citei, provavelmente você não terá grandes dificuldades no seu aprendizado.&lt;/p&gt;

&lt;p&gt;Onde encontro conteúdo?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/" rel="noopener noreferrer"&gt;FreeCodeCamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codecademy.com/learn/introduction-to-javascript" rel="noopener noreferrer"&gt;CodeAcademy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.learn-js.org" rel="noopener noreferrer"&gt;Learn JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Programação Funcional
&lt;/h2&gt;

&lt;p&gt;A partir da versão 16.8 o React migrou a criação de componentes para funções, dando o suporte ao controle de estados e todo o ciclo de vida do componente usando funções.&lt;/p&gt;

&lt;p&gt;Nas versões anteriores, os componentes eram declarados como classe, o ciclo de vida era gerenciado através de métodos embutidos(componentDidMount,componentDidUpdate, etc) e os estados eram controlados através de atributos e métodos.&lt;/p&gt;

&lt;p&gt;Com a nova versão, é possível controlar todo o componente usando apenas funções. Além disso, foi criada também a "Context API", que veio para suprir a necessidade de uso do Redux para controlar estados "globais" em uma aplicação.&lt;/p&gt;

&lt;p&gt;Onde encontro conteúdo?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/trainingcenter/programa%C3%A7%C3%A3o-funcional-para-iniciantes-9e2beddb5b43" rel="noopener noreferrer"&gt;Programação Funcional para Iniciantes - Training Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fellipecouto/programao-funcional-o-que--e-qual-a-importncia-2nia"&gt;O que é programação funciona e qual a sua importância - Fellipe Couto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@paula_vaz/fundamentos-de-programa%C3%A7%C3%A3o-funcional-4b483aeeda9d" rel="noopener noreferrer"&gt;Fundamentos da programação funcional - Paula Vaz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Os 3 tópicos acima não necessariamente cobrem tudo o que você precisa saber para entender como o React funciona, mas eles podem te dar um bom direcionamento para aprender a usar essa biblioteca que revolucionou o desenvolvimento front-end. Boa sorte nos seus estudos!&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Deixe suas reações e me siga em outras redes: &lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Até o próximo artigo!👋🏽&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Design: Arte ou Processo?</title>
      <dc:creator>Matheus dos Reis de Jesus</dc:creator>
      <pubDate>Thu, 25 Mar 2021 21:32:57 +0000</pubDate>
      <link>https://dev.to/reisdev/design-arte-ou-processo-3loe</link>
      <guid>https://dev.to/reisdev/design-arte-ou-processo-3loe</guid>
      <description>&lt;p&gt;&lt;span&gt;Capa por &lt;a href="https://unsplash.com/@uxindo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;UX Indonesia&lt;/a&gt; no &lt;a href="https://unsplash.com/s/photos/design-process?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Recentemente cursei uma disciplina chamada "Visualização de Dados", e, semanalmente, a professora selecionava um conjunto de artigos sobre design, processo criativo e visualização de dados para discutirmos. Gostei tanto de um dos conjuntos de artigos que resolvi escrever sobre eles.&lt;/p&gt;

&lt;p&gt;Todos os artigos estão em inglês e foram publicados na &lt;a href="https://www.nature.com/nmeth/" rel="noopener noreferrer"&gt;Nature Methods&lt;/a&gt;. Cada tópico deste artigo está acompanhado do seu respectivo link.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Saliência para Relevância&lt;/li&gt;
&lt;li&gt;Elementos do Estilo Visual&lt;/li&gt;
&lt;li&gt;Narrativa&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Saliência para Relevância
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nature.com/articles/nmeth.1762" rel="noopener noreferrer"&gt;Link para o artigo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este primeiro artigo fala especialmente sobre destacar visualmente uma informação sobre as demais. O autor usa um exemplo bem interessante na figura 2a:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdi7asonv8csnqvrjoz67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdi7asonv8csnqvrjoz67.png" alt="Alt Text" width="800" height="339"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.nature.com/articles/nmeth.1762/figures/2" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nmeth.1762/figures/2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo o autor: Combinar saliência com relevância chama a atenção visual para as informações importantes.&lt;/p&gt;

&lt;p&gt;No heat map acima, a intenção era destacar os pontos vermelhos em detrimento dos pontos azuis. Porém, o efeito foi inverso. Os pontos azuis escuro sobressaem aos pontos avermelhados. Logo, o objetivo dessa visualização não foi atingido.&lt;/p&gt;

&lt;p&gt;A ideia destacada neste artigo é exatamente a de tentar mostrar relevância através de saliência. Destacar uma informação é muito útil, mas precisa ser eficiente. O uso de cores e figuras deve ser feito com cuidado.&lt;/p&gt;

&lt;p&gt;Na figura 2b o autor destaca o problema do uso de figuras em movimento. O formato usado sugere que os conteúdos em textos são relevantes para o slide em questão. Porém, as figuras em movimento do lado esquerdo podem distrair o leitor e prejudicar a compreensão da informação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elementos do Estilo Visual
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nature.com/articles/nmeth.2444" rel="noopener noreferrer"&gt;Link para o artigo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse artigo fala mais especificamente sobre a construção de elementos visuais e como a escolha dos seus componentes influencia na compreensão do leitor.&lt;/p&gt;

&lt;p&gt;O primeiro exemplo que o artigo usa é a figura a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5aj3ycr4y415vi5cqtym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5aj3ycr4y415vi5cqtym.png" alt="Imagem com um grafo multicolorido, com 3 a 4 nós conectando pares de nós. As arestas também tem várias cores" width="800" height="317"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.nature.com/articles/nmeth.2444/figures/1" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nmeth.2444/figures/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo o autor: Uma enxurrada de símbolos idênticos desencadeia uma "saciedade semântica", um fenômeno em que a repetição exagerada resulta em uma perda de significado.&lt;/p&gt;

&lt;p&gt;O problema nessa imagem é que os elementos tem cores diferentes, tanto os nós quanto as arestas. Logo, o uso de cores não tem significado na imagem. A ausência de legenda também impossibilita a compreensão do que as cores representam. Usar um conjunto limitado de cores e apresentar o significado de cada torna a leitura de elemento visual muito mais fácil.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofvfjkteerh6ey4cyj4l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofvfjkteerh6ey4cyj4l.png" alt="Uma imagem com um conjunto de figuras: um gráfico de barras, um gráfico de pizza com várias cores, um cromossomo, uma sequência de figuras geométricas, um cilindro com uma espécie de corda ao redor, uma seta verde com círculo vermelho em cima, com a escrita K3 e por fim, um balão com a escrita " width="800" height="358"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.nature.com/articles/nmeth.2444/figures/2" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nmeth.2444/figures/2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo o autor: Use a representação mais simples para objetos e omita informações desnecessárias.&lt;/p&gt;

&lt;p&gt;O uso de elementos com diferentes formas na figura A, além de dificultar a interpretação, não acrescentam nada em seu significado. A figura B torna a compreensão muito mais fácil, e as informações mais importantes estão de fato em destaque.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbsl74w5oppdi9jjwrpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbsl74w5oppdi9jjwrpi.png" alt="Conjunto de figuras com formatos diferentes. Na primeira linha, dois conjuntos demonstrando interseção, o primeiro com múltiplas clores e o segundo com apenas uma escala de cores. Na segunda linha, 8 figuras: um desenho indefinido com a escrita " width="800" height="475"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.nature.com/articles/nmeth.2444/figures/3" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nmeth.2444/figures/3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo o autor: Objetos que interagem ou que tem significado em comum devem ser formatados de maneira similar, para induzir a intuição.&lt;/p&gt;

&lt;p&gt;Mais uma vez, a escolha de formas e cores afetando a compreensão da informação contida em um elemento visual. As imagens a esquerda não induzem uma correlação entre os elementos que deveriam ser similares, já que eles possuem cores diferentes e formatos irregulares. Os itens à direita, diferentemente, sugerem uma relação entre os itens e inclusive possibilitam o destaque de alguns deles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Narrativa
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nature.com/articles/nmeth.2571" rel="noopener noreferrer"&gt;Link para o artigo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse artigo fala a respeito do uso de elementos visuais para contar histórias, também conhecido como "Storytelling". As visualizações desse tipo relacionam eventos durante um intervalo de tempo ou de valores definido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo39y0w3g67dt8c2psmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo39y0w3g67dt8c2psmg.png" alt="Alt Text" width="800" height="219"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.nature.com/articles/nmeth.2571/figures/1" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nmeth.2571/figures/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo o autor: Use agregação para reduzir o detalhe dos dados e enfatizar a mensagem: Existem relativamente de médio intervalo.&lt;/p&gt;

&lt;p&gt;Começando em um conjunto dos valores e finalizando em um gráfico de barras, a imagem anterior apresenta o processo de transformação dos dados em uma visualização que transmita uma ideia de maneira mais sucinta, sem precisar de muitas informações visíveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2o0ipsxquexgstk2gcfp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2o0ipsxquexgstk2gcfp.png" alt="Alt Text" width="800" height="1114"&gt;&lt;/a&gt;&lt;br&gt;
Fonte: &lt;a href="https://www.nature.com/articles/nmeth.2571/figures/2" rel="noopener noreferrer"&gt;https://www.nature.com/articles/nmeth.2571/figures/2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo os autores: Uma história adiciona significado e clareza para estatísticas complexas.&lt;/p&gt;

&lt;p&gt;Em alguns casos, apenas elementos visuais não são suficientes para apresentar uma informação de maneira clara. Quando se tem estatísticas mais complexas, apresentar uma contextualização do problema/situação pode facilitar a compreensão por parte do leitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Depois de tantos exemplos de como o design funciona e os critérios que ele deve obedecer para cumprir seu propósito, o que você acha? Design é apenas uma "arte", fruto da imaginação e criatividade, ou ele é resultado de um processo minucioso que exige conhecimento e dedicação? Ou talvez ambos?&lt;/p&gt;

&lt;p&gt;Gostou deste artigo? Deixe suas reações e me siga em outras redes: &lt;a href="https://twitter.com/reisdev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://instagram.com/reisdev" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; | &lt;a href="https://youtube.com/reisdev" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Até o próximo artigo!👋🏽&lt;/p&gt;

</description>
      <category>design</category>
      <category>creative</category>
      <category>braziliandevs</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
