<?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>Forem: Beatriz da Silva</title>
    <description>The latest articles on Forem by Beatriz da Silva (@beatrizdasilva).</description>
    <link>https://forem.com/beatrizdasilva</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%2F400079%2Fb06e5467-09d9-468b-a7ba-80e529256773.jpeg</url>
      <title>Forem: Beatriz da Silva</title>
      <link>https://forem.com/beatrizdasilva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/beatrizdasilva"/>
    <language>en</language>
    <item>
      <title>Dia 12 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Sat, 21 Oct 2023 01:26:48 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-12-100daysofswift-1m3i</link>
      <guid>https://forem.com/beatrizdasilva/dia-12-100daysofswift-1m3i</guid>
      <description>&lt;h1&gt;
  
  
  Opcionais
&lt;/h1&gt;

&lt;p&gt;Permitem que representemos um dado que não existe, mas que pode ou não vir a existir na memória.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unwrapping
&lt;/h2&gt;

&lt;p&gt;Quando um dado é opcional regular o swift não nos permite acessá-lo sem antes verificar se ele é nil(não existe na memória) ou existe mesmo, essa verificação se chama unwrap.&lt;br&gt;
As duas formas mais comuns de fazer unwrap são com &lt;code&gt;if let&lt;/code&gt; e &lt;code&gt;guard let&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  if let
&lt;/h3&gt;

&lt;p&gt;Faz o unwrap com uma condição, se tiver algum valor dentro do opcional você consegue usá-lo, caso contrário a condição falha e você pode fazer alguma outra ação que não use o opcional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lfmgVq18--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tlhlmsgs9spr9otgesfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lfmgVq18--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tlhlmsgs9spr9otgesfb.png" alt="Image description" width="800" height="304"&gt;&lt;/a&gt;Checa se existe um dado dentro de nome pra que o dado possa ser usado&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A partir do Swift 5.7 não é mais necessário o uso de binding(passar o valor do opcional pra uma constante) no if let&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  guard let
&lt;/h3&gt;

&lt;p&gt;Faz o unwrap passando o dado existente pra uma constante(binding), caso ache nil fecha a função, loop ou condição onde foi usado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D5Yi3cmO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0hg6bplmyum17otnwrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D5Yi3cmO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0hg6bplmyum17otnwrf.png" alt="Image description" width="800" height="229"&gt;&lt;/a&gt;Checa se foi passada uma string na chamada da função, como esse dado foi passado usa ele depois do guard&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A maior diferença entre &lt;code&gt;if let&lt;/code&gt; e &lt;code&gt;guard let&lt;/code&gt; é que no guard o dado que foi checado e agora é não opcional continua usável depois do guard.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Force unwrapping
&lt;/h2&gt;

&lt;p&gt;Quando você tem um valor opcional mas tem certeza absoluta de que ele não é nil é possível forçar o swift a transformar ele em um tipo não opcional usando &lt;code&gt;!&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XXPwRtm1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54sygqsv1mc0bce00h0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XXPwRtm1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54sygqsv1mc0bce00h0t.png" alt="Image description" width="800" height="248"&gt;&lt;/a&gt;O próprio swift gera warnings em casos mais arriscados dando alternativas, mas nem sempre isso vai acontecer então é bom usar ! com cautela&lt;/p&gt;

&lt;p&gt;O uso de force unwrapping é bastante contraindicado na maioria dos casos porque você pode esquecer alguma validação e o dado chegar nil no ponto do código que força essa conversão pra não opcional, caso isso aconteça o código &lt;em&gt;crasha&lt;/em&gt; e esse é o pior cenário possível pra um app.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implicitly Unwrapped Optionals
&lt;/h2&gt;

&lt;p&gt;Assim como os opcionais regulares, podem conter um dado ou serem nil, mas diferente dos regulares você não precisa fazer unwrap pra utilizá-los.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Implicitly unwrapped optionals&lt;/em&gt; são criados adicionando uma exclamação depois do nome: &lt;code&gt;let idade: Int! = nil&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por se comportarem como opcionais em que já foi feito o unwrap, não é necessário fazer &lt;code&gt;if let&lt;/code&gt; ou &lt;code&gt;guard let&lt;/code&gt; pra usá-los, mas se tentarmos usá-los e eles forem nil o código da crash.&lt;/p&gt;

&lt;p&gt;Usamos esse tipo de opcional quando uma variável começa como nil, mas sabemos que sempre vai ter um valor dentro dela antes de precisarmos usá-la, o uso desse tipo evita que precisemos fazer &lt;code&gt;if let&lt;/code&gt; toda hora, mas num geral é melhor evitar e usar opcionais regulares.&lt;/p&gt;

&lt;p&gt;No UIKit são comumente usadas pra layout, já no SwiftUI quase não são utilizadas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nil coalescing | Valor padrão
&lt;/h2&gt;

&lt;p&gt;O operador nil coalescing faz o unwrap do opcional e retorna o valor dentro dele, mas caso esse valor seja nil ele retorna o valor que foi colocado como padrão: &lt;code&gt;?? valorPadrao&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--myBIttJN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5j11ft8d7wv2qfokm8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--myBIttJN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5j11ft8d7wv2qfokm8r.png" alt="Image description" width="800" height="180"&gt;&lt;/a&gt;Valor padrão é um Int 7&lt;/p&gt;




&lt;h2&gt;
  
  
  Optional chaining
&lt;/h2&gt;

&lt;p&gt;É um processo para consultar e chamar propriedades e métodos opcionais. Se o opcional contiver um valor, a chamada de propriedade/método da certo e retorna sempre um opcional, se for nil retorna nil. Várias consultas podem ser encadeadas e toda a cadeia falha se algum deles for nil.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qLMtohIW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6j00r5ku0kz2v8hgx5qz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qLMtohIW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6j00r5ku0kz2v8hgx5qz.png" alt="Image description" width="800" height="180"&gt;&lt;/a&gt;O retorno de um optional chaining sempre é um valor opcional ou nil&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HaXx3OUI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/quk9ovf5u31bfise4z11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HaXx3OUI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/quk9ovf5u31bfise4z11.png" alt="Image description" width="800" height="40"&gt;&lt;/a&gt;O retorno é nil porque apesar Daken ser uma chave válida o valor(sobrenome) está vazio, assim o first retorna nil&lt;/p&gt;




&lt;h2&gt;
  
  
  Failable initializer
&lt;/h2&gt;

&lt;p&gt;É possível criar um init para struct ou classe que pode falhar. Caso um objeto não possa ser instanciado com os dados que foram passados, ao invés de retornar sempre uma nova instância, retorna nil. Caso os dados sejam válidos retorna uma instância opcional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EOMl1zyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lxu9s8bhzifo2d68h5av.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EOMl1zyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lxu9s8bhzifo2d68h5av.png" alt="Image description" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9Ju85EIJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wa369jfe044snypwdzl6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9Ju85EIJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wa369jfe044snypwdzl6.png" alt="Image description" width="800" height="101"&gt;&lt;/a&gt;Instância opcional criada&lt;/p&gt;




&lt;h2&gt;
  
  
  Typecasting
&lt;/h2&gt;

&lt;p&gt;Nos permite verificar o tipo de uma instância e mostrar ao Swift como tratá-la dentro da sua própria hierarquia, é muito útil ao trabalhar com protocolos e herança de classe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p_JptF2L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1xuucb49mifu5rdifnf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p_JptF2L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1xuucb49mifu5rdifnf.png" alt="Image description" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 11 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Sun, 15 Oct 2023 21:20:58 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-11-100daysofswift-lo0</link>
      <guid>https://forem.com/beatrizdasilva/dia-11-100daysofswift-lo0</guid>
      <description>&lt;h1&gt;
  
  
  Protocolos
&lt;/h1&gt;

&lt;p&gt;São uma forma de descrever quais propriedades e métodos algo(structs, classes, enums) deve ter, então quando escrevemos um código dizendo que algo conforma com um protocolo o Swift vai fazer com que implementemos todas as propriedades e métodos que existem nesse protocolo. É uma forma de tratar dados de uma forma mais geral.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o1r05fBC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro0wu7qnlpi5hps1slr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o1r05fBC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro0wu7qnlpi5hps1slr8.png" alt="Image description" width="645" height="303"&gt;&lt;/a&gt;Método &lt;strong&gt;comprar&lt;/strong&gt; que só permite livros como parâmetro&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2TWDf_JP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dg94atat0zegdxxcs765.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2TWDf_JP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dg94atat0zegdxxcs765.png" alt="Image description" width="645" height="618"&gt;&lt;/a&gt;Método &lt;strong&gt;comprar&lt;/strong&gt; que aceita qualquer item que conforme com o protocolo &lt;strong&gt;Adquirivel&lt;/strong&gt; como parâmetro&lt;/p&gt;

&lt;p&gt;Assim como as classes, protocolos podem herdar de outros protocolos, isso ajuda a diminuir duplicação de código e a adicionar restrições quando necessário.&lt;/p&gt;




&lt;h1&gt;
  
  
  Extensions
&lt;/h1&gt;

&lt;p&gt;Permitem adicionar métodos à tipos existentes pra fazer coisas que eles não foram criados originalmente pra fazer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wu_MiEth--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nlx1ufevsjwez790pf12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wu_MiEth--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nlx1ufevsjwez790pf12.png" alt="Image description" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro uso para extensions é organização de código.&lt;br&gt;
&lt;strong&gt;Conformance grouping&lt;/strong&gt; é quando se adiciona uma conformidade de protocolo a uma extensão, adicionando todos os métodos necessários dentro dela.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Purpose grouping&lt;/strong&gt; é quando se cria extensões para realizar tarefas específicas.&lt;/p&gt;




&lt;h1&gt;
  
  
  Protocol extensions
&lt;/h1&gt;

&lt;p&gt;São como extensions normais, mas ao invés de estender um tipo específico como Int, podemos estender um protocolo inteiro para que todos os tipos em conformidade recebam as alterações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9FkyL_eE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/56pf6xnsp287oyogjx5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9FkyL_eE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/56pf6xnsp287oyogjx5a.png" alt="Image description" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Protocol extensions podem fornecer implementações pros métodos dos nossos próprios protocolos, permitindo o uso da técnica de programação orientada à protocolo.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 10 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Sun, 15 Oct 2023 18:59:38 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-10-100daysofswift-2l3g</link>
      <guid>https://forem.com/beatrizdasilva/dia-10-100daysofswift-2l3g</guid>
      <description>&lt;h1&gt;
  
  
  Classes
&lt;/h1&gt;

&lt;p&gt;Classes são bem parecidas com Structs mas tem algumas diferenças importantes:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Init
&lt;/h2&gt;

&lt;p&gt;Classes não tem init padrão, caso tenha propriedades na classe você sempre tem que criar o seu próprio init ao cria-la.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yUEft2jt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dociztkghbhyzrcniq9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yUEft2jt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dociztkghbhyzrcniq9y.png" alt="Image description" width="572" height="243"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Herança
&lt;/h2&gt;

&lt;p&gt;Uma classe pode ser criada herdeira de outra classe, assim ela ganha as propriedades e métodos da classe pai; É possível adicionar novas propriedades e métodos nela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tq7Vtg_T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qbe7jskj0k8dwla4wo43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tq7Vtg_T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qbe7jskj0k8dwla4wo43.png" alt="Image description" width="605" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por segurança o Swift sempre nos faz usar &lt;code&gt;super. init()&lt;/code&gt; em classes filho, pra caso a classe pai faça algo importante no init não tenha nenhum problema.&lt;/p&gt;




&lt;h3&gt;
  
  
  Sobrescrever métodos
&lt;/h3&gt;

&lt;p&gt;Caso queira sobrescrever algum método da classe pai é só colocar a palavra reservada &lt;code&gt;override&lt;/code&gt; no início da implementação do método na classe filho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--otgMarU2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/buurlv8litfdxa2xboj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--otgMarU2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/buurlv8litfdxa2xboj8.png" alt="Image description" width="606" height="807"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Class
&lt;/h3&gt;

&lt;p&gt;Classes com a palavra &lt;code&gt;final&lt;/code&gt; no início não podem ser herdadas e ter seus métodos sobrescritos, geram erro em tempo de compilação. &lt;br&gt;
&lt;code&gt;final&lt;/code&gt; também pode ser usado em métodos ou propriedades pro mesmo efeito, assim deixando o resto das coisas não marcadas com comportamento padrão pra herança.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6m80B7Xu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fr0wczsqpbhhtqrrbur4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6m80B7Xu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fr0wczsqpbhhtqrrbur4.png" alt="Image description" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Cópias
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Classes&lt;/strong&gt; são &lt;em&gt;reference type&lt;/em&gt;, quando instanciamos uma classe a RAM aloca um espaço na memória e atribui o endereço à instância criada, objetos tipo referência apontam pro mesmo endereço de memória, por isso apontam pros mesmos dados compartilhados(mudar uma classe, muda todas), já &lt;strong&gt;Structs&lt;/strong&gt; são &lt;em&gt;value type&lt;/em&gt;, cada instância cria uma cópia exclusiva dos dados, caso uma instância seja modificada a outra não é.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t5Fp-Op---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z8lc4dsuxqjpgh5s8xvx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t5Fp-Op---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z8lc4dsuxqjpgh5s8xvx.png" alt="Image description" width="403" height="328"&gt;&lt;/a&gt;Cópia de Classe&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0-OzXRgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5l4ywx2ayqouc7lk4o4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0-OzXRgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5l4ywx2ayqouc7lk4o4.png" alt="Image description" width="403" height="328"&gt;&lt;/a&gt;Cópia de Struct&lt;/p&gt;




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

&lt;p&gt;Classes podem ter &lt;em&gt;deinitializers&lt;/em&gt;, que são métodos chamados quando uma instância da classe é destruída.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Mutabilidade
&lt;/h2&gt;

&lt;p&gt;Propriedades variáveis em Classes constantes podem ser modificadas livremente, mas propriedades variáveis em Structs constantes não podem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EtsEW4P8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3t101xbftdoxvmu03gjt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EtsEW4P8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3t101xbftdoxvmu03gjt.png" alt="Image description" width="800" height="235"&gt;&lt;/a&gt;Propriedade variável sendo modificada em Classe constante&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i-xy63Gj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gd0vqap48xwjx6okpudk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i-xy63Gj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gd0vqap48xwjx6okpudk.png" alt="Image description" width="800" height="235"&gt;&lt;/a&gt;Erro ao tentar modificar propriedade variável em Struct constante&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 9 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Sun, 15 Oct 2023 15:50:11 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-9-100daysofswift-2h9l</link>
      <guid>https://forem.com/beatrizdasilva/dia-9-100daysofswift-2h9l</guid>
      <description>&lt;h3&gt;
  
  
  Inicializadores
&lt;/h3&gt;

&lt;p&gt;Toda struct tem um &lt;em&gt;init&lt;/em&gt; padrão(memberwise initializer), mas é possível criar outros inits e ao criar um init o padrão é substituído. &lt;br&gt;
Caso queira manter o init padrão mesmo após criar um, é só mover o init personalizado pra uma extension.&lt;/p&gt;




&lt;h3&gt;
  
  
  Self
&lt;/h3&gt;

&lt;p&gt;Dentro do método é possível nos referir à instância da estrutura usando &lt;em&gt;self&lt;/em&gt;, isso é bastante usado pra usar o mesmo nome de variável ao criar o init.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Flhirfn5zgoo2n7k74jnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flhirfn5zgoo2n7k74jnp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O self serve para indicar que uma propriedade diz respeito ao elemento(struct, class) e não a uma variável local.&lt;/p&gt;




&lt;h3&gt;
  
  
  Lazy
&lt;/h3&gt;

&lt;p&gt;Para otimização de performance o Swift nos deixa criar algumas propriedades apenas quando elas são necessárias(Lazy), parecido com as propriedades computadas; Mas ao contrário dessas, as propriedades lazy armazenam o resultado calculado, evitando retrabalho nos próximos acessos.&lt;br&gt;
São bem performáticas quando não estão sendo utilizadas porque o código nunca roda e ainda mais performáticas quando usadas várias vezes porque seu valor é armazenado em cache.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não são indicadas pra uso em coisas que não precisam de armazenamento ou que não são modificadas constantemente.&lt;/li&gt;
&lt;li&gt;Não podem ser utilizadas em structs constantes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Propriedades e métodos estáticos
&lt;/h3&gt;

&lt;p&gt;Declarando uma propriedade ou método como estático é possível compartilhar eles em todas as instâncias da struct já que eles passam a ser membros da própria struct ao invés de cada instância ter o seu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ftaex5akta1czh51oq3bu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ftaex5akta1czh51oq3bu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Controle de acesso
&lt;/h3&gt;

&lt;p&gt;O controle de acesso do swift é baseado no conceito de módulos e arquivos e tem 5 níveis de acesso diferentes para entidades(propriedades, tipos, funções...) dentro do código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open&lt;/strong&gt; - Permite que entidades sejam usadas no módulo de definição e em qualquer outro que importe o módulo de definição; Pode acessar e sobrescrever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public&lt;/strong&gt; - Permite que entidades sejam usadas no módulo de definição e em qualquer outro que importe o módulo de definição; Pode acessar, mas não pode sobrescrever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal&lt;/strong&gt; - Padrão do Swift, tudo que está no mesmo módulo pode ser acessado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File-private&lt;/strong&gt; - Só quem está no mesmo arquivo pode usar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private&lt;/strong&gt; - Só quem declarou ou extensões de quem declarou(no mesmo arquivo) podem usar.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 8 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Thu, 05 Oct 2023 01:05:12 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-8-100daysofswift-5035</link>
      <guid>https://forem.com/beatrizdasilva/dia-8-100daysofswift-5035</guid>
      <description>&lt;h3&gt;
  
  
  Diferença de Struct e Tupla
&lt;/h3&gt;

&lt;p&gt;Ambas tem comportamentos semelhantes, mas a struct leva um nome e a tupla não, por isso structs são melhores pra ser usadas em casos que você precisa usar a mesma estrutura de variáveis mais de uma vez.&lt;/p&gt;




&lt;h3&gt;
  
  
  Diferença de propriedade armazenada e computada e quando usar cada uma
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Propriedade armazenada:&lt;/strong&gt; Valor é armazenado na memória pra ser usado depois.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se for lida regularmente e o valor não depender de outras propriedades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Propriedade computada:&lt;/strong&gt; Valor é recomputado toda vez que é chamado, nada mais é do que uma chamada de função que pertence à Struct. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se a propriedade é lida raramente é melhor usar esse tipo, evitando o cálculo e armazenamento de algo quase nunca utilizado.&lt;/li&gt;
&lt;li&gt;Se o valor da propriedade depende de valores de outras propriedades, assim você vai ter certeza de que o valor retornado sempre leva em conta o estado mais recente do programa.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Variáveis computadas criadas dentro de uma struct não podem ter seu valor modificado manualmente, ele só pode ser acessado.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Property Observers(willSet e didSet)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;willSet&lt;/strong&gt; é chamado &lt;em&gt;antes&lt;/em&gt; do valor ser atribuído a uma propriedade&lt;br&gt;
&lt;strong&gt;didSet&lt;/strong&gt; é chamado &lt;em&gt;depois&lt;/em&gt; de uma propriedade ter recebido um valor, toda vez que o valor for modificado a ação dentro dele será executada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7hHhJEB---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96rytygqkvlrh1sr91u3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7hHhJEB---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96rytygqkvlrh1sr91u3.png" alt="Image description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Métodos
&lt;/h3&gt;

&lt;p&gt;Structs podem ter funções, elas se chamam métodos e eles podem usar as propriedades da struct conforme necessário. Apesar da nomenclatura diferente a palavra reservada pra declaração de métodos é a mesma de uma função: &lt;em&gt;func&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diferença entre método e função
&lt;/h3&gt;

&lt;p&gt;Métodos pertencem à um tipo(struct, enum, class) e as funções não.&lt;br&gt;
Essa associação à um tipo específico permite que os métodos façam referência a propriedades e métodos dentro do mesmo tipo e diferente das funções os nomes não ficam reservados, reduzindo conflitos de nomes por acidente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métodos mutantes
&lt;/h3&gt;

&lt;p&gt;Para que as propriedades sejam mutáveis é necessário usar a palavra-chave &lt;em&gt;mutating&lt;/em&gt; no início do método, mas ao fazer isso o método não poderá mais ser chamado por structs constantes(mesmo se o método nunca tiver mudado suas propriedades).&lt;br&gt;
Um método que não for marcado como mutante não pode chamar uma função mutante, ambos tem que estar marcados pra se relacionar.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Quase todos os tipos principais do Swift são implementados como structs(String, Inteiros, Array, Dictionary, Bool).&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 6 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Fri, 18 Aug 2023 03:27:11 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-6-100daysofswift-4m7</link>
      <guid>https://forem.com/beatrizdasilva/dia-6-100daysofswift-4m7</guid>
      <description>&lt;h1&gt;
  
  
  Closures
&lt;/h1&gt;

&lt;p&gt;Closures são funções passadas por parâmetro em outras funções. &lt;/p&gt;

&lt;p&gt;O motivo mais comum pro uso de closures é pra fazer algo que você quer que o código faça, mas não exatamente naquele momento, por exemplo fazer algo após um delay, o fim de uma animação, o término de um download ou após o usuário selecionar alguma opção.&lt;/p&gt;

&lt;p&gt;Closures nos permitem agrupar várias funcionalidades em uma única variável e em seguida armazenar em algum lugar, também é possível retornar de uma função e armazenar a closure em outro lugar.&lt;/p&gt;

&lt;p&gt;Também é possível colocar parâmetros nas closures, a diferença entre uma closure e uma função padrão na chamada é que a função tem labels pros parâmetros e closures não.&lt;/p&gt;

&lt;p&gt;Pra retornar um valor numa closure que não recebe parâmetros é preciso colocar parênteses vazio, a seta e o tipo que será retornado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RsGQLWMX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9p94p30xrkyk39npd8jq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RsGQLWMX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9p94p30xrkyk39npd8jq.png" alt="Image description" width="738" height="156"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Trailing Closure
&lt;/h2&gt;

&lt;p&gt;Quando o último parâmetro de uma função é uma closure, o swift nos deixa usar &lt;em&gt;trailing closure&lt;/em&gt;, que nada mais é do que passar a closure diretamente depois da chamada da função; E em casos em que a closure é o único parâmetro os parênteses podem ser eliminados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lTNsOKeV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6b2xxyemlhdl1tcgm6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lTNsOKeV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6b2xxyemlhdl1tcgm6y.png" alt="Image description" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;
Função com closure



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kWZ7v13k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhd1un9xovch97w2de7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kWZ7v13k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhd1un9xovch97w2de7z.png" alt="Mesma função mas usando trailing closure" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;
Mesma função, mas usando trailing closure



</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 5 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Thu, 10 Aug 2023 04:59:58 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-5-100daysofswift-3e89</link>
      <guid>https://forem.com/beatrizdasilva/dia-5-100daysofswift-3e89</guid>
      <description>&lt;h2&gt;
  
  
  Funções
&lt;/h2&gt;

&lt;p&gt;Servem pra criar blocos de código que serão usados mais de uma vez, assim reduzindo código repetido. É uma boa prática criar funções que tenham apenas uma responsabilidade.&lt;/p&gt;

&lt;p&gt;Quando a função tem uma única expressão a palavra reservada &lt;em&gt;return&lt;/em&gt; pode ser omitida:&lt;br&gt;
&lt;a href="https://media.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%2Fj5d2lpfqxneu70xmjl5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fj5d2lpfqxneu70xmjl5v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É possível retornar mais de um valor numa função usando tuplas ou alguma coleção(array ou dicionário):&lt;br&gt;
&lt;a href="https://media.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%2Ffbu3a5g9wtobjtxrpvdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffbu3a5g9wtobjtxrpvdk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Swift permite que coloquemos dois nomes em cada parâmetro, sendo o primeiro de uso externo e o segundo de uso interno, permite também omitir o parâmetro na chamada da função(usando _), ambas as formas podem ser usadas pra deixar o código mais fácil de ler.&lt;br&gt;
&lt;a href="https://media.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%2F6v30notcuqh40ner1vco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F6v30notcuqh40ner1vco.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando temos um parâmetro que na maioria das vezes vai receber um valor específico, pra facilitar dá pra colocar um parâmetro padrão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Throwing functions
&lt;/h3&gt;

&lt;p&gt;As vezes num código algo pode dar erro, mas ser um erro mais "tranquilo", por exemplo quando um app consome dados de uma API e por algum motivo não foi possível decodificar os dados que estão sendo recebidos, nesses casos é muito útil saber que um erro aconteceu sem crashar o app, assim é possível dar um feedback visual pro usuário e deixá-lo livre pra tentar fazer outras coisas no app.&lt;/p&gt;

&lt;p&gt;O Swift nos permite lançar erros dentro de funções, pra isso é preciso colocar a palavra &lt;em&gt;throws&lt;/em&gt; antes do tipo de retorno da função, e dentro dela usar a palavra &lt;em&gt;throw&lt;/em&gt; quando algo der errado e aí chamar algum erro que você criou num enum que conforma com o protocolo &lt;em&gt;Error&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pra chamar uma throwing function é preciso usar três palavras: &lt;em&gt;do&lt;/em&gt;, &lt;em&gt;try&lt;/em&gt;, e &lt;em&gt;catch&lt;/em&gt;, como a linguagem nos força a usar try ao chamar uma throwing function, fica bem fácil de saber visualmente quais funções podem ou não causar erros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F05tbmizyd2ui0debvzuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F05tbmizyd2ui0debvzuj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 4 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Fri, 02 Jun 2023 20:26:10 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-4-100daysofswift-2bip</link>
      <guid>https://forem.com/beatrizdasilva/dia-4-100daysofswift-2bip</guid>
      <description>&lt;h2&gt;
  
  
  For
&lt;/h2&gt;

&lt;p&gt;É o loop mais comum em swift, é possível usar arrays e ranges nele. Depois da palavra &lt;em&gt;for&lt;/em&gt; você pode usar qualquer string(desde que não seja uma palavra reservada) pra representar o contador do loop.&lt;br&gt;
Quando o loop for a partir de um range você pode tanto colocar o range direto no loop quanto colocar o range numa variável e colocar a variável no loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IA7mBAkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnrwezorh7oox3tsj15f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IA7mBAkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnrwezorh7oox3tsj15f.png" alt="Image description" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JmPZCyM---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sp9stxqvjjzbuw1m3dv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JmPZCyM---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sp9stxqvjjzbuw1m3dv6.png" alt="Image description" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso não vá usar a variável depois do &lt;em&gt;for&lt;/em&gt; pra nada, nem precisa nomea-la, é só colocar um &lt;code&gt;_&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l3BnUF7l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i80f8dhlaq6ra7l34fxo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l3BnUF7l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i80f8dhlaq6ra7l34fxo.png" alt="Image description" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  While
&lt;/h2&gt;

&lt;p&gt;Nesse tipo de loop você coloca uma condição a ser checada e dentro dele o que deve ser feito e um modificador dessa condição, o loop acaba quando a condição se tornar falsa. &lt;br&gt;
São mais usados em casos onde você não sabe previamente quantas vezes precisará que o loop aconteça, como por exemplo quando você quer que algo aconteça até que o usuário pare a ação ou até que tenha carregado as informações necessárias.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vNYph30z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2xr7hwt98gacxt3048ju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vNYph30z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2xr7hwt98gacxt3048ju.png" alt="Image description" width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Repeat
&lt;/h2&gt;

&lt;p&gt;Bem pouco usado, esse é quase igual ao While, a diferença é que no Repeat a ação do loop será realizada pelo menos uma vez, já que a condição a ser checada acontece apenas no final de cada loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FN9btSsc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s9dxaeekamntlm4ba8rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FN9btSsc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s9dxaeekamntlm4ba8rt.png" alt="Image description" width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
    <item>
      <title>Dia 3 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Thu, 01 Jun 2023 23:05:17 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-3-100daysofswift-15g0</link>
      <guid>https://forem.com/beatrizdasilva/dia-3-100daysofswift-15g0</guid>
      <description>&lt;h2&gt;
  
  
  Operadores de comparação
&lt;/h2&gt;

&lt;p&gt;Servem pra comparar dados num geral, podem ser usado pra dados numéricos, texto, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fghgr131ahwwnwnbj5tyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fghgr131ahwwnwnbj5tyd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador ternário
&lt;/h2&gt;

&lt;p&gt;É muito útil pra quando se quer fazer algo específico se algo for verdadeiro ou falso de forma bem mais enxuta do que usando um if/else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjubjk3wh2pcmkgwi0vbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjubjk3wh2pcmkgwi0vbv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo o valor resultante do ternário é atribuído à variável z:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F8rccbwd4ygdlwaebw3k5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8rccbwd4ygdlwaebw3k5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Switch
&lt;/h2&gt;

&lt;p&gt;Se tiver que fazer várias condicionais usando um mesmo valor como parâmetro, fica mais fácil usar um switch do que um if/else.&lt;/p&gt;

&lt;p&gt;Caso queira que mesmo após cair num case ele também execute o próximo é só colocar a keyword fallthrough.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fr2x07vz39tol8np0znyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fr2x07vz39tol8np0znyi.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operadores de range
&lt;/h2&gt;

&lt;p&gt;No swift existem duas formas de representar um range.&lt;br&gt;
&lt;code&gt;..&amp;lt;&lt;/code&gt; exclui o último número do range:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fa0oc8496ymill6i6qsyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fa0oc8496ymill6i6qsyv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;...&lt;/code&gt; inclui todos os números que estão no range.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fszlxl5duwhyadnvuay3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fszlxl5duwhyadnvuay3p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>swift</category>
      <category>ios</category>
    </item>
    <item>
      <title>Dia 2 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Fri, 26 May 2023 02:34:28 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-2-100daysofswift-4jcg</link>
      <guid>https://forem.com/beatrizdasilva/dia-2-100daysofswift-4jcg</guid>
      <description>&lt;h2&gt;
  
  
  Arrays
&lt;/h2&gt;

&lt;p&gt;São coleções de dados de um mesmo tipo que podem armazenar tanto dados primitivos(como Int, String, Bool) como classes e objetos; São usados pra guardar mais de um valor em apenas uma variável e pode conter dois ou mais valores iguais.&lt;/p&gt;

&lt;p&gt;Cada espaço num array é chamado de elemento, cada elemento é representado por um número que sempre começa em 0 e chamamos de índice.&lt;/p&gt;

&lt;p&gt;O array abaixo guarda o nome dos membros da equipe X-Men da abertura do evolution, são 8 membros, então o array tem 8 elementos, com índices que vão do 0 ao 7.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let xMen = ["Ciclope", "Jean Grey", "Spyke", "Wolverine", "Tempestade", "Vampira", "Lince Negra", "Noturno"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É possível criar um array vazio e preenche-lo depois:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var xMen = [String]()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se você tentar acessar um índice que não existe vai &lt;em&gt;crashar&lt;/em&gt; o código, por exemplo, se você tentar acessar o índice 8 no array &lt;code&gt;xMen[8]&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sets
&lt;/h2&gt;

&lt;p&gt;Também são coleções de dados, mas diferente do array, ele guarda os dados de forma desordenada e não guarda itens repetidos, cada elemento é único, por isso caso coloque o mesmo elemento duas ou mais vezes, ele vai ignorar e guardar o elemento apenas uma vez e por ser desordenado não é possível acessar os elementos com índices. &lt;/p&gt;

&lt;p&gt;Usamos o set ao invés do array quando precisamos garantir que cada elemento aparecerá apenas uma vez no conjunto e a ordem dos elementos não é importante.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;let viloes: Set = ["fenix negra", "apocalipse", "magneto"]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;É possíver criar um set vazio e depois preenche-lo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var viloes = Set&amp;lt;String&amp;gt;()&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tuplas
&lt;/h2&gt;

&lt;p&gt;Assim como o array, as tuplas permitem armazenar vários conjuntos de dados numa mesma variável, mas não é possível adicionar ou remover itens de uma tupla, elas tem um tamanho fixo; Não é possível mudar o tipo dos itens numa tupla depois dela criada.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var nome = (primeiroNome: "Laura", sobrenome: "Kinney")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você pode acessar um elemento de uma tupla usando o índice(que também começa em 0):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou um nome que você deu pro elemento:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome.primeiroNome&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você pode mudar o valor de dentro da tupla depois dela criada, mas não o tipo, se tentasse mudar pra (primeiroNome: "Logan", idade: 57) retornaria um erro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicionários
&lt;/h2&gt;

&lt;p&gt;É parecido com um array, mas no dicionário você escolhe a chave identificadora ao invés de ele criar isso automaticamente em forma de índice, os elementos são guardados em forma de &lt;strong&gt;chave : valor&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let paises = [
    "Noturno": "Alemanha",
    "Wolverine": "Canadá",
    "Mancha Solar": "Brasil"
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso um elemento não seja encontrado o dicionário retorna nil, é possível colocar um valor default pro dicionário quando ele não encontrar a chave entre os elementos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;paises["Vampira", default: "Desconhecido"]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;É possível criar um dicionário vazio e depois preencher os elementos dele:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var paises = [String: String]()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;paises["Vampira"] = "Estados Unidos"&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enums
&lt;/h2&gt;

&lt;p&gt;É um jeito de definir um grupo de valores relacionados de um jeito que seja fácil de usa-los, por exemplo um enum poderia ser usado pra definir à qual grupo um mutante pertence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Grupo {
    case instituto
    case irmandade
    case morlocks
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;let tempestade = Grupo.instituto&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enums também podem guardar valores associados à cada case, por exemplo um enum de ações simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Acao {
    case andando(destino: String)
    case falando(assunto: String)
    case voando(onde: String)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;let falando = Acao.falando(assunto: "como derrotar o magneto")&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um bom lugar pra conseguir mais informações sobre como algo em Swift ou de um framework da Apple funciona com exemplos é a &lt;strong&gt;Developer Documentation&lt;/strong&gt;, pra acessar a doc pelo Xcode:&lt;/p&gt;

&lt;p&gt;Atalho de teclado - Command + Shift + 0&lt;br&gt;
Menu superior do Xcode - Help &amp;gt;&amp;gt; Developer Documentation&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>todayilearned</category>
      <category>swift</category>
      <category>ios</category>
    </item>
    <item>
      <title>Dia 1 - #100DaysOfSwift</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Wed, 24 May 2023 02:29:31 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/dia-1-100daysofswift-2mef</link>
      <guid>https://forem.com/beatrizdasilva/dia-1-100daysofswift-2mef</guid>
      <description>&lt;p&gt;Swift é uma linguagem type-safe, isso significa que ela obriga o código a respeitar os contratos estabelecidos.&lt;/p&gt;

&lt;p&gt;Quando criamos uma variável em Swift não precisamos dizer o tipo da variável, o Swift pode inferir o tipo de acordo com o que for armazenado.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var greeting = "Hello"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mas se preferir, podemos ser mais explícitos e especificar na declaração da variável o seu tipo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var greeting: String = "Hello"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Depois disso o valor pode mudar quantas vezes for preciso, mas o tipo da variável não pode mais ser mudado.&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>swift</category>
      <category>ios</category>
    </item>
    <item>
      <title>Optional Chaining / Force Unwrapping</title>
      <dc:creator>Beatriz da Silva</dc:creator>
      <pubDate>Thu, 22 Oct 2020 18:27:15 +0000</pubDate>
      <link>https://forem.com/beatrizdasilva/optional-chaining-force-unwrapping-3m48</link>
      <guid>https://forem.com/beatrizdasilva/optional-chaining-force-unwrapping-3m48</guid>
      <description>&lt;p&gt;&lt;em&gt;Evitar&lt;/em&gt; &lt;strong&gt;Force Unwrapping&lt;/strong&gt; (Exclamação !) - Isso deixa o código inseguro, caso esqueça alguma verificação da crash no app&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional Chaining&lt;/strong&gt; (Interrogação ?) - Se for nil não faz nada, se existir faz (seguro em relação à crash), mas caso seja nil o usuário não recebe nenhuma notificação&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>swift</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
