{"id":7580,"date":"2025-05-02T12:16:16","date_gmt":"2025-05-02T15:16:16","guid":{"rendered":"https:\/\/geekblogti.wpengine.com\/?p=7580"},"modified":"2025-05-08T10:57:40","modified_gmt":"2025-05-08T13:57:40","slug":"o-que-mudou-no-swift-5","status":"publish","type":"post","link":"https:\/\/www.geekhunter.com/pt/blog\/o-que-mudou-no-swift-5\/","title":{"rendered":"O que mudou no Swift 5?"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">Ol\u00e1. Nessa mat\u00e9ria voc\u00ea ir\u00e1 encontrar algumas das novidades da mais recente vers\u00e3o (lan\u00e7ada em Mar\u00e7o de 2019) da<strong> linguagem Swift<\/strong>, o Swift 5, utilizada para o desenvolvimento de aplica\u00e7\u00f5es para os dispositivos da <strong>Apple<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O conte\u00fado explica detalhadamente alguns dos principais recursos introduzidos e tamb\u00e9m apresenta alguns <em>trechos de c\u00f3digo<\/em>, para tornar o aprendizado bem pr\u00e1tico.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para executar os c\u00f3digos apresentados \u00e9 necess\u00e1rio ter o<strong> Xcode<\/strong> a partir da vers\u00e3o 10.2, que suporta o<strong> Swift 5<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Tamb\u00e9m \u00e9 poss\u00edvel baixar o<a href=\"https:\/\/drive.google.com\/file\/d\/1gGgQvatJI6DgzoiAw6Hjk05yk8l-j1cw\/view\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" playground dispon\u00edvel  (abre numa nova aba)\"><strong> playground<\/strong><\/a> dispon\u00edvel aqui, que possui todos os trechos de c\u00f3digos apresentados.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><a href=\"http:\/\/bit.ly\/2JPyTWt\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" class=\"wp-image-7613\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/CTA-Rodap\u00e9-Front-end-e-Back-end-1024x134.jpg\" alt=\"\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Interoperabilidade no Swift 5<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" class=\"wp-image-7598\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-1024x576.jpg\" alt=\"fundo roxo com logo da linguagem swift 5 e da geekhunter\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-1024x576.jpg 1024w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-150x84.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-100x56.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-600x337.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-450x253.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-960x540.jpg 960w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-300x169.jpg 300w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5-768x432.jpg 768w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Interoperabilidade-no-Swift-5.jpg 1366w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O <strong>Swift 5<\/strong> traz para a linguagem alguns recursos importantes que possibilitam a <em>interoperabilidade<\/em> entre as aplica\u00e7\u00f5es, bibliotecas e sistemas operacionais com suporte a diferentes vers\u00f5es da linguagem.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Esses recursos s\u00e3o de extrema import\u00e2ncia e demonstram uma grande <strong>evolu\u00e7\u00e3o da linguagem<\/strong>, fazendo com que ela se estabele\u00e7a ainda mais fortemente no mercado.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Eles s\u00e3o semelhantes entre si, mas cada um permite uma coisa um pouco diferente da outra. Veja a seguir uma explica\u00e7\u00e3o mais aprofundada sobre cada um deles.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">&gt;&gt;<strong>Leitura Recomendada:<\/strong><br \/><em>Um guia para o <\/em><a href=\"https:\/\/www.geekhunter.com\/pt\/blog\/um-guia-para-o-programador-iniciante\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"programador iniciante (abre numa nova aba)\"><strong><em>programador iniciante<\/em><\/strong><\/a><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">ABI \u2013 Application Binary Interface<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa tecnologia, declarada est\u00e1vel a partir da nova vers\u00e3o de n\u00famero 5, faz com que todos os <strong>sistemas operacionais da Apple<\/strong> possuam a biblioteca padr\u00e3o da linguagem.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Isso faz com que as aplica\u00e7\u00f5es criadas fiquem menores, porque a biblioteca padr\u00e3o n\u00e3o precisa mais estar nas aplica\u00e7\u00f5es.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">E permite interoperabilidade entre as aplica\u00e7\u00f5es que foram desenvolvidas com o <strong>Swift 5 <\/strong>e os sistemas operacionais que possuem suporte \u00e0 vers\u00e3o e \u00e0s vers\u00f5es posteriores da linguagem que forem lan\u00e7adas.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"850\" height=\"594\" class=\"wp-image-7603\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface.jpg\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface.jpg 850w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface-150x105.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface-100x70.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface-600x419.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface-450x314.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/ABI-\u2013-Application-Binary-Interface-773x540.jpg 773w\" sizes=\"(max-width: 850px) 100vw, 850px\" \/>\r\n<figcaption><em>Exemplo do que o ABI possibilita. Uma aplica\u00e7\u00e3o desenvolvida com o Swift 5 ir\u00e1 funcionar tanto em uma m\u00e1quina que tenha suporte a mesma vers\u00e3o, quanto em m\u00e1quinas que tenham suporte a hipot\u00e9ticas vers\u00f5es superiores a 5.\u00a0 <\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Module Stability<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa tecnologia permite a interoperabilidade entre <em>frameworks<\/em> e aplica\u00e7\u00f5es, independente da vers\u00e3o do <strong>Swift<\/strong> com a qual ambos foram desenvolvidos.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Isso faz com que seja desnecess\u00e1rio garantir que a aplica\u00e7\u00e3o e as suas bibliotecas sejam desenvolvidas com a mesma vers\u00e3o do <strong>Swift<\/strong> (isso a partir da vers\u00e3o 5).<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa tecnologia trabalha em conjunto com a ABI, e ainda n\u00e3o est\u00e1 totalmente est\u00e1vel.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"820\" height=\"684\" class=\"wp-image-7602\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Module-Stability.jpg\" alt=\"grafico\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Module-Stability.jpg 820w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Module-Stability-150x125.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Module-Stability-100x83.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Module-Stability-600x500.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Module-Stability-450x375.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Module-Stability-647x540.jpg 647w\" sizes=\"(max-width: 820px) 100vw, 820px\" \/>\r\n<figcaption><em> Exemplo do que o Module Stability possibilita. Um framework que foi desenvolvido com uma suposta vers\u00e3o 6 da linguagem funciona tanto com a vers\u00e3o 6 quanto com uma hipot\u00e9tica vers\u00e3o 7 ou superior.\u00a0 <\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Library Evolution<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa tecnologia faz com que seja desnecess\u00e1rio recompilar uma aplica\u00e7\u00e3o quando alguma das bibliotecas padr\u00e3o do <strong>Swift<\/strong> forem atualizadas. Ela tamb\u00e9m ainda n\u00e3o est\u00e1 totalmente est\u00e1vel.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"496\" class=\"wp-image-7601\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Library-Evolution.jpg\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Library-Evolution.jpg 850w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Library-Evolution-150x88.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Library-Evolution-100x58.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Library-Evolution-600x350.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Library-Evolution-450x263.jpg 450w\" sizes=\"(max-width: 850px) 100vw, 850px\" \/>\r\n<figcaption><em> Exemplo do que a Library Evolution possibilita. Uma aplica\u00e7\u00e3o que utiliza uma vers\u00e3o de alguma biblioteca padr\u00e3o do Swift ir\u00e1 funcionar tanto em m\u00e1quinas cujo sistema operacional d\u00ea suporte a mesma vers\u00e3o dessa biblioteca, quanto em m\u00e1quinas cujo sistema operacional d\u00ea suporte a vers\u00f5es posteriores dessa mesma biblioteca.\u00a0 <\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A imagem a seguir apresenta um resumo sobre as tecnologias apresentadas:<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">&nbsp;<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"378\" class=\"wp-image-7604\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Resumo.jpg\" alt=\"tabela\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo.jpg 850w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo-150x67.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo-100x44.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo-600x267.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo-450x200.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo-300x133.jpg 300w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Resumo-768x342.jpg 768w\" sizes=\"(max-width: 850px) 100vw, 850px\" \/>\r\n<figcaption>Como \u00e9 poss\u00edvel ver, somente a ABI encontra-se est\u00e1vel, enquanto as outras duas ainda est\u00e3o em desenvolvimento, e talvez demore algumas novas vers\u00f5es at\u00e9 que elas estejam 100% funcionais.\u00a0<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Swift 5<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" class=\"wp-image-7599\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Swift-5-1024x576.jpg\" alt=\"fundo roxo com logo da linguagem swift 5 e da geekhunter\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-1024x576.jpg 1024w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-150x84.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-100x56.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-600x337.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-450x253.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-960x540.jpg 960w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-300x169.jpg 300w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-768x432.jpg 768w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5.jpg 1366w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nessa se\u00e7\u00e3o ser\u00e3o apresentados alguns dos principais recursos que foram introduzidos \u00e0 linguagem, o que impacta diretamente a vida dos desenvolvedores e das aplica\u00e7\u00f5es desenvolvidas com suas vers\u00f5es anteriores.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Casos Futuros de Enum<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Assim como outras linguagens, Swift possui uma estrutura chamada <em>enum<\/em>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Um <em>enum<\/em> \u00e9 uma estrutura que permite definir uma lista de valores (<em>enu<\/em>m vem de enumeration \u2013 enumera\u00e7\u00e3o).<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ele tamb\u00e9m pode possuir propriedades, fun\u00e7\u00f5es, m\u00e9todos e construtores.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A seguir \u00e9 apresentado a declara\u00e7\u00e3o do enum <strong>Categoria<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ele poderia ser utilizado, por exemplo, como propriedade de uma entidade produto, ou mesmo ser passado como par\u00e2metro de uma fun\u00e7\u00e3o para se executar uma a\u00e7\u00e3o espec\u00edfica de acordo com o seu valor.\u00a0<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/e9482078ac8d15da2c853094b9685b73.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Uma pr\u00e1tica muito comum quando trabalhando com<strong> enum<\/strong> \u00e9 utilizar um <strong>swtich case <\/strong>para executar diferentes a\u00e7\u00f5es para cada possibilidade do valor do<strong> enum<\/strong>, como apresentado a seguir:<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/6f1b4460553738b2f609f0794b6459ea.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">No trecho de c\u00f3digo acima, \u00e9 definida uma vari\u00e1vel do tipo do <strong>enum<\/strong> <strong>Categoria<\/strong> e um valor \u00e9 atribu\u00eddo a ela.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Em seguida \u00e9 executada uma instru\u00e7\u00e3o <strong>swtich case<\/strong>, que executa a\u00e7\u00f5es espec\u00edficas para dois casos do<strong> enum<\/strong> e uma a\u00e7\u00e3o gen\u00e9rica para qualquer outro caso.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Esse \u00e9 um exemplo muito simples, mas para o problema que quero mostrar \u00e9 importante ter em mente que em aplica\u00e7\u00f5es maiores e mais complexas pode-se encontrar facilmente um<strong> enum<\/strong>, que \u00e9 utilizado em diversas partes do projeto.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Tendo isso em vista, imagine o seguinte cen\u00e1rio: por algum motivo ser\u00e1 necess\u00e1rio adicionar um novo valor ao <strong>enum<\/strong>, para a categoria adulto, e executar uma a\u00e7\u00e3o espec\u00edfica para esse novo valor.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O problema que surge \u00e9 encontrar todos os casos em que o <strong>enum<\/strong> \u00e9 utilizado em um<strong> switch case<\/strong> para acrescentar a nova tratativa.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para solucionar esse problema o<strong> Swift 5<\/strong> introduz a nota\u00e7\u00e3o <strong>@unknown default<\/strong> para o<strong> switch case<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/58051b606b904c35290b3f1b07c747ab.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O nota\u00e7\u00e3o<strong> @unknown default<\/strong>: permite que o <strong>switch case<\/strong> possua uma a\u00e7\u00e3o gen\u00e9rica.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Mas, caso ele n\u00e3o contemple todos os casos poss\u00edveis de valores do <strong>enum<\/strong>, \u00e9 exibido um <em>alert<\/em> no c\u00f3digo, tornando mais f\u00e1cil encontrar os casos em que o <strong>enum<\/strong> foi usado em um <strong>switch case <\/strong>quando um novo valor for inserido, facilitando a manuten\u00e7\u00e3o do projeto.\u00a0<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-7605\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Casos-Futuros-de-Enum-1024x272.jpg\" alt=\"\" \/>\r\n<figcaption><em> Aviso exibido no Xcode devido ao uso da nota\u00e7\u00e3o @unknown default:, que torna a manuten\u00e7\u00e3o do c\u00f3digo mais f\u00e1cil em grandes projetos. <\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Nova Fun\u00e7\u00e3o isMultiple(of:)<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Antes da vers\u00e3o 5, para se verificar se um n\u00famero <strong>A<\/strong> \u00e9 m\u00faltiplo de outro n\u00famero <strong>B<\/strong> era necess\u00e1rio ver se o resto da divis\u00e3o de <strong>A<\/strong> por <strong>B<\/strong> \u00e9 igual a zero \u2013 isso continua funcionando.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com o Swift 5, todo n\u00famero inteiro possui a fun\u00e7\u00e3o <strong>isMultiple(of:)<\/strong>, que recebe outro n\u00famero inteiro e retorna<em> true<\/em> ou<em> false<\/em> para o caso de ser ou n\u00e3o m\u00faltiplo.\u00a0<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/50dec097ff38be349bcba19d33f1c8e4.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Novas Propriedades: isNumber e isAlphabetic<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nessa nova vers\u00e3o \u00e9 poss\u00edvel identificar se um caractere \u00e9 um n\u00famero, atrav\u00e9s da propriedade<strong> isNumber<\/strong>, bem como verificar se os caracteres de uma <strong>String<\/strong> s\u00e3o letras, atrav\u00e9s da propriedade<strong> isAlphabetic<\/strong> na representa\u00e7\u00e3o <em>Unicode<\/em> de cada caractere.\u00a0<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/180f9eef114e88be35c58e941793befd.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essas duas novas propriedades podem ser muito \u00fateis quando trabalhando com valida\u00e7\u00e3o de valores textuais digitados pelo usu\u00e1rio e que devem estar em algum formato espec\u00edfico.\u00a0<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Tratativa de Optionals Aninhados<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Uma das grandes preocupa\u00e7\u00f5es da linguagem Swift \u00e9 possibilitar a constru\u00e7\u00e3o de c\u00f3digos seguros \u2013 c\u00f3digos que n\u00e3o possuam erro.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Pensando nisso, a linguagem adota o conceito de <strong>Optional<\/strong>, que nada mais do que um tipo de dado que pode ser nulo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A utiliza\u00e7\u00e3o desse recurso, combinada com estruturas como <em>if let<\/em> e<em> guard let<\/em>, possibilitam evitar a ocorr\u00eancia de erros ao se tentar acessar o valor de uma vari\u00e1vel que n\u00e3o possui valor. \u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Veja a seguir um exemplo de utiliza\u00e7\u00e3o de <strong>Optional<\/strong> e da estrutura<em> if let.<\/em><\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/a3099b128c5aaa4ce7d41c8e82b242d4.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Outro mecanismo que tamb\u00e9m possibilita a constru\u00e7\u00e3o de c\u00f3digos mais seguros \u00e9 a estrutura <strong>do<\/strong> <strong>try catch<\/strong>, disponibilizada pela linguagem <strong>Swift<\/strong> para tratar erros que podem vir a ocorrer como resultado da execu\u00e7\u00e3o de algum trecho de c\u00f3digo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Veja a seguir um exemplo de utiliza\u00e7\u00e3o da estrutura<em> do<\/em> <em>try catch<\/em>.<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/26172fd08b04863ed28b12bb7df099a4.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O trecho de c\u00f3digo acima est\u00e1 fazendo o seguinte:\u00a0\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>1.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Declara um enum do tipo <strong>Error<\/strong> que possui um caso de erro.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>2.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Declara a fun\u00e7\u00e3o <strong>divedeIfPossible(_: _:) throws -&gt; Double<\/strong>?.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa fun\u00e7\u00e3o divide somente valores positivos. Caso algum dos valores seja negativo \u00e9 retornado<strong> nil<\/strong>, caso o segundo par\u00e2metro seja zero \u00e9 retornado o erro do <strong>enum<\/strong> declarado anteriormente, e caso ambos os valores sejam positivos e n\u00e3o nulos \u00e9 retornado o <strong>resultado da divis\u00e3o<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Sim, essa fun\u00e7\u00e3o \u00e9 esdr\u00faxula, \u00a0mas ela ser\u00e1 muito \u00fatil para ilustrar esse t\u00f3pico e te fazer entender a conclus\u00e3o dessa se\u00e7\u00e3o. \u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>3.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Executa-se a chamada da fun\u00e7\u00e3o dentro de um bloco <strong>do<\/strong> com utiliza\u00e7\u00e3o do termo <strong>try<\/strong> antes da chamada da fun\u00e7\u00e3o, e um bloco <strong>catch <\/strong>caso a fun\u00e7\u00e3o retorne o erro de divis\u00e3o por zero.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nesse caso, como o segundo par\u00e2metro foi passado como zero, a fun\u00e7\u00e3o ir\u00e1 retornar o erro, que ser\u00e1 impresso na tela ao passar pela tratativa no bloco <strong>catch<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Aqui, tamb\u00e9m \u00e9 importante notar que \u00e9 utilizado a estrutura<em> if let<\/em> para desempacotar o valor <strong>Optional<\/strong> que ser\u00e1 retornado da fun\u00e7\u00e3o criada em caso de sucesso. \u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O <strong>Swift<\/strong> possui uma vers\u00e3o resumida da estrutura <em>do try catch <\/em>que torna poss\u00edvel executar a mesma coisa que foi executada no passo 3 do exemplo anterior em uma \u00fanica linha. \u00c9 a nota\u00e7\u00e3o <strong>try?<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Veja o exemplo de utiliza\u00e7\u00e3o seguido da explica\u00e7\u00e3o:<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/9fb57a85a87c590bae5ade5dd33400c0.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O trecho de c\u00f3digo usa a nota\u00e7\u00e3o<strong> try?<\/strong> antes da chamada da fun\u00e7\u00e3o <strong>divedeIfPossible(_: _:) throws -&gt; Double?<\/strong>, que pode retornar um erro.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa instru\u00e7\u00e3o faz com que a fun\u00e7\u00e3o seja executada e, caso seja retornado um erro, ele ser\u00e1 transformado em um tipo <strong>Double?<\/strong>, contendo o valor <strong>nil<\/strong>; e caso retorne um valor, ele tamb\u00e9m \u00e9 encapsulado em um<strong> Optional<\/strong>, contendo o valor retornado pela fun\u00e7\u00e3o.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Enfim chegamos ao nosso problema: devido ao fato de a nossa fun\u00e7\u00e3o retornar um valor <strong>Optional<\/strong> e a instru\u00e7\u00e3o <strong>try?<\/strong> tamb\u00e9m tentar encapsular o valor retornando da fun\u00e7\u00e3o dentro de outro <strong>Optional<\/strong> ao fim da execu\u00e7\u00e3o do trecho de c\u00f3digo acima acabar\u00edamos com um retorno do tipo<strong> Double??<\/strong> (um Double duplamente <strong>Optional<\/strong>).<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Isso \u00e9 ruim porque d\u00e1 mais trabalho para o desenvolvedor, fazendo com que seja necess\u00e1rio desempacotar o valor duas vezes.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com o <strong>Swift 5<\/strong> isso n\u00e3o acontece mais, e em casos como esse o valor retornado ser\u00e1 do tipo Double? (somente um <strong>Optional<\/strong>). Veja as imagens a seguir que ilustram o problema.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-7665\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-3-1-1024x290.jpg\" alt=\"codigos de programacao\" \/>\r\n<figcaption><em>Utiliza\u00e7\u00e3o da instru\u00e7\u00e3o try? com a fun\u00e7\u00e3o divedIfPossible criada anteriormente no Swift 4.2. O tipo do valor retornado \u00e9 Double??<\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"213\" class=\"wp-image-7607\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-1024x213.jpg\" alt=\"codigos de programacao\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-1024x213.jpg 1024w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-150x31.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-100x21.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-600x125.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-450x93.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-960x199.jpg 960w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-300x62.jpg 300w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2-768x160.jpg 768w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-2.jpg 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\r\n<figcaption><em>Desempacotamento do valor retornado no Swift 4.2. <\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-7666\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Tratativa-de-Optionals-Aninhados-1-1-1024x301.jpg\" alt=\"codigos de programacao\" \/>\r\n<figcaption><em> Utiliza\u00e7\u00e3o da instru\u00e7\u00e3o try? com a fun\u00e7\u00e3o divedIfPossible criada anteriormente no Swift 5.0. O tipo do valor retornado \u00e9 Double?<\/em><\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><a href=\"http:\/\/bit.ly\/2JPyTWt\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" class=\"wp-image-7614\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/CTA-Rodap\u00e9-Front-end-e-Back-end-1-1024x134.jpg\" alt=\"\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Nova Fun\u00e7\u00e3o compactMapValues()<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O <strong>Swift 5<\/strong> traz uma nova fun\u00e7\u00e3o nativa para dicion\u00e1rios, a <strong>compactMapValues<\/strong>, que possibilita mudar o tipo dos valores de um dicion\u00e1rio e remover os pares cujo os valores s\u00e3o <strong>nil<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Isso \u00e9 feito atrav\u00e9s de uma <strong>Closure<\/strong> que deve ser passado como par\u00e2metro da fun\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A <strong>Closure<\/strong> deve retornar um valor <strong>Optional<\/strong> do novo tipo de dados para o qual os valores do dicion\u00e1rio ser\u00e3o transformados.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Sempre que essa <strong>Closure<\/strong> retornar um valor nil o par chave\/valor correspondente \u00e9 eliminado no novo dicion\u00e1rio.<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/d833d94635789f7745426dc666a17513.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">No exemplo acima temos um dicion\u00e1rio de alunos e suas notas do tipo <strong>[String:String]<\/strong> (isso quer dizer que suas chaves e os seus valores s\u00e3o <strong>Strings<\/strong>).<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ele poderia ser o resultado obtido pela chamada de uma <strong>API,<\/strong> por exemplo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Entretanto, seria muito complicado trabalhar com as notas dos alunos no formato de texto.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com isso, a fun\u00e7\u00e3o <strong>compactMapValues<\/strong> \u00e9 utilizada no dicion\u00e1rio para transformar as notas em valores inteiros e remover os alunos que ainda n\u00e3o possuem nota, facilitando a manipula\u00e7\u00e3o da estrutura.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A implementa\u00e7\u00e3o da <strong>Closure<\/strong> tenta transformar o valor recebido em um inteiro, para ent\u00e3o retorn\u00e1-lo, e caso n\u00e3o consiga, retorna <strong>nil<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa implementa\u00e7\u00e3o poderia ser simplificada, possibilitando executar a mesma filtragem de maneira muito mais elegante.<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/71a1f6a438b5cfaf6f58528850aec3c2.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Raw Strings<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Em <strong>Swift<\/strong>, assim como em grande parte das linguagens de programa\u00e7\u00e3o, os valores do tipo texto s\u00e3o criados com a utiliza\u00e7\u00e3o das aspas duplas (abre-se aspas duplas, coloca-se o texto desejado, fecha-se aspas duplas).<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">H\u00e1 casos em que \u00e9 necess\u00e1rio utilizar alguns caracteres especiais em uma <strong>String<\/strong>. Por exemplo, quando se quer colocar uma aspa dupla como parte da <strong>String<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para isso, \u00e9 necess\u00e1rio adicionar um valor de escape antes do caractere (uma barra invertida).\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com as <strong>Raw Strings <\/strong>\u00e9 desnecess\u00e1rio a utiliza\u00e7\u00e3o dessa barra invertida, tornando a constru\u00e7\u00e3o da <strong>String<\/strong> muito mais simplificada.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para isso, basta adicionar uma <em>hashtag<\/em> antes e ap\u00f3s as aspas que abrem e fecham a <strong>String<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para se utilizar o caractere <em>hashtag<\/em> dentro da <strong>String<\/strong>, coloca-se duas hashtags antes e ap\u00f3s as aspas que abrem e fecham a <strong>String<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">E, para a interpola\u00e7\u00e3o de valores em uma <strong>Raw String<\/strong>, deve-se adicionar uma barra invertida, a mesma quantidade de<em> hashtags<\/em> utilizada antes e ap\u00f3s as aspas que abrem e fecham a string, e o valor que se quer concatenar entre par\u00eanteses.<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/9b486db993f3330cb3db613b668fcca8.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Tamb\u00e9m \u00e9 poss\u00edvel construir <strong>Raw Strings<\/strong> de m\u00faltiplas linhas (<strong>Strings<\/strong> de m\u00faltiplas linhas n\u00e3o s\u00e3o novidades do Swift 5).<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/1c027640be64be36a85a0a33fdd8df96.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Um grande exemplo de utiliza\u00e7\u00e3o das <strong>Raw Strings<\/strong> \u00e9 na constru\u00e7\u00e3o de regex.\u00a0<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/0d495c110f651483079e391d3b273bcd.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Dynamically Callable Types<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Esse novo recurso da linguagem foi pensado para facilitar a sua utiliza\u00e7\u00e3o em conjunto com outras linguagens como<strong><a href=\"https:\/\/www.geekhunter.com\/pt\/blog\/arrays-em-javascript\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" JavaScript (abre numa nova aba)\"> JavaScript<\/a><\/strong> e <strong>Python<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ele permite, basicamente, utilizar um objeto como se fosse uma fun\u00e7\u00e3o, com passagem ilimitada de par\u00e2metros e diferentes tipos de dado como retorno.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Veja a seguir um exemplo de utiliza\u00e7\u00e3o:<\/p>\r\n\r\n\r\n\r\n<p><script src=\"https:\/\/gist.github.com\/rsg73626\/7dc5af4aa9e1a0a56655e9826ebcdf32.js\"><\/script><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O trecho de c\u00f3digo acima est\u00e1 fazendo o seguinte:<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong> 1.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Declara a classe <strong>CalculatorOfOneOperation<\/strong> (calculadora de uma opera\u00e7\u00e3o \u2013 novamente um componente que muito dificilmente ser\u00e1 utilizado em um cen\u00e1rio real, mas que ser\u00e1 muito \u00fatil para a explica\u00e7\u00e3o do recurso), que possui um atributo \u2013 uma <strong>Closure<\/strong> que recebe dois valores do tipo <strong>Double<\/strong> e tamb\u00e9m retorna um valor do tipo <strong>Double<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Esse argumento representa qual o tipo de opera\u00e7\u00e3o realizada pelo objeto instanciado a partir da classe, e deve ser passado para o seu construtor.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A nota\u00e7\u00e3o<strong> @dynamicCallable<\/strong> serve para dizer que a classe criada \u00e9 um tipo din\u00e2mico que pode gerar objetos que podem ser utilizados como fun\u00e7\u00f5es, permitindo a configura\u00e7\u00e3o da classe para que isso ocorra.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>2 e 3.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Declara as fun\u00e7\u00f5es que s\u00e3o chamadas quando o objeto criado a partir da classe <strong>CalculatorOfOneOperation <\/strong>\u00e9 utilizado como uma fun\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Suas implementa\u00e7\u00f5es s\u00e3o iguais, e utilizam a <strong>Closure<\/strong> passada no construtor do objeto para executar a opera\u00e7\u00e3o definida em todos os valores que forem passados como argumentos durante a chamada.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A diferen\u00e7a \u00e9 que para utilizar a primeira \u00e9 necess\u00e1rio dar nome aos argumentos (definir os <em>labels<\/em>) na hora da chamada, enquanto que na segunda n\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">\u00a0<strong>4.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">\u00c9 instanciado um objeto que permite a realiza\u00e7\u00e3o de somas.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>5.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Utiliza o objeto criado no passo anterior como se fosse uma fun\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Os valores passados como argumento ser\u00e3o transformados no vetor [ 1, 2, 3, 4, 5 ], que ser\u00e1 passado como valor do argumento <strong>args<\/strong> da fun\u00e7\u00e3o definida no item 3.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>6.<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\" style=\"text-align: left;\">Utiliza o objeto criado no passo anterior como se fosse uma fun\u00e7\u00e3o, nomeando os par\u00e2metros da chamada.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Os valores passados como argumento ser\u00e3o transformados no dicion\u00e1rio <strong>[ &#8220;arg1&#8221; : 1, &#8220;arg2&#8221; : 2, &#8220;arg3 &#8220;: 3, &#8220;arg4&#8221; : 4, &#8220;arg5&#8221; : 5 ]<\/strong>, que ser\u00e1 passado como valor do argumento <strong>args <\/strong>da fun\u00e7\u00e3o definida no item 2.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>&gt;<em>&gt;Leitura Recomendada:<\/em><\/strong><em><br \/><\/em><a href=\"https:\/\/www.geekhunter.com\/pt\/blog\/introducao-ao-flutter-o-framework-do-google\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Flutter (abre numa nova aba)\"><strong><em>Flutter: introdu\u00e7\u00e3o<\/em><\/strong><\/a><em> ao framework da Google\u00a0<\/em><\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" class=\"wp-image-7600\" src=\"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/conclusao-1024x576.jpg\" alt=\"fundo roxo com logo da linguagem swift e da geekhunter\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-1024x576.jpg 1024w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-150x84.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-100x56.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-600x337.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-450x253.jpg 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-960x540.jpg 960w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-300x169.jpg 300w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao-768x432.jpg 768w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/conclusao.jpg 1366w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A cada nova vers\u00e3o da <strong>linguagem Swif<\/strong>t, novos recursos importantes s\u00e3o adicionados, como \u00e9 o caso da vers\u00e3o 5, que traz para os desenvolvedores novos recursos que facilitam o seu trabalho.\u00a0\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa mat\u00e9ria apresentou apenas alguns dos <strong>principais recursos novos<\/strong> que foram introduzidos. Mais novidades e todos os recursos podem ser encontrados nas documenta\u00e7\u00f5es e blogs oficiais da linguagem. <br \/><br \/><strong>Crie um perfil na GeekHunter e receba propostas alinhadas ao seu perfil. S\u00e3o mais de 1000 vagas abertas, inclusive <a href=\"https:\/\/www.geekhunter.com\/pt\/vagas\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Vagas Swift (iOS) (abre numa nova aba)\">Vagas Swift (iOS)<\/a> e <a href=\"https:\/\/www.geekhunter.com\/pt\/vagas\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Vagas Swift (MacOS) (abre numa nova aba)\">Vagas Swift (MacOS)<\/a><\/strong>.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1. Nessa mat\u00e9ria voc\u00ea ir\u00e1 encontrar algumas das novidades da mais recente vers\u00e3o (lan\u00e7ada em Mar\u00e7o de 2019) da linguagem Swift, o Swift 5, utilizada para o desenvolvimento de aplica\u00e7\u00f5es para os dispositivos da Apple. O conte\u00fado explica detalhadamente alguns dos principais recursos introduzidos e tamb\u00e9m apresenta alguns trechos de c\u00f3digo, para tornar o aprendizado [&hellip;]<\/p>\n","protected":false},"author":167,"featured_media":7597,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-7580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimiento-de-software"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.6 (Yoast SEO v28.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Swift 5: Novidades da Vers\u00e3o - Blog Geekhunter<\/title>\n<meta name=\"description\" content=\"Nesse artigo falamos sobre as novidades da vers\u00e3o 5.0 da linguagem de desenvolvimento mobile Swift. Quer aprender Swift 5? Leia!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"O que mudou no Swift 5?\" \/>\n<meta property=\"og:description\" content=\"Ol\u00e1. Nessa mat\u00e9ria voc\u00ea ir\u00e1 encontrar algumas das novidades da mais recente vers\u00e3o (lan\u00e7ada em Mar\u00e7o de 2019) da linguagem Swift, o Swift 5, utilizada\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Geekhunter\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geekhunterbr\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-02T15:16:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-08T13:57:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-Novidades-da-Vers\u00e3o.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1366\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Geekhunter\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:site\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Geekhunter\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/\"},\"author\":{\"name\":\"Geekhunter\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/9f62b173345139f7bbdaf55312c3d400\"},\"headline\":\"O que mudou no Swift 5?\",\"datePublished\":\"2025-05-02T15:16:16+00:00\",\"dateModified\":\"2025-05-08T13:57:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/\"},\"wordCount\":2679,\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Swift-5-Novidades-da-Vers\u00e3o.jpg\",\"articleSection\":[\"Desenvolvimiento de software\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/\",\"name\":\"Swift 5: Novidades da Vers\u00e3o - Blog Geekhunter\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Swift-5-Novidades-da-Vers\u00e3o.jpg\",\"datePublished\":\"2025-05-02T15:16:16+00:00\",\"dateModified\":\"2025-05-08T13:57:40+00:00\",\"description\":\"Nesse artigo falamos sobre as novidades da vers\u00e3o 5.0 da linguagem de desenvolvimento mobile Swift. Quer aprender Swift 5? Leia!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/o-que-mudou-no-swift-5\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Swift-5-Novidades-da-Vers\u00e3o.jpg\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Swift-5-Novidades-da-Vers\u00e3o.jpg\",\"width\":1366,\"height\":768,\"caption\":\"fundo roxo com logo da linguagem swift e da geekhunter\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-mudou-no-swift-5\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mundo TI\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Desenvolvimiento de software\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/desenvolvimiento-de-software\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"O que mudou no Swift 5?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"name\":\"Blog de TI\",\"description\":\"Dicas para o RH e profissionais da \u00e1rea TI\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\",\"name\":\"GeekHunter\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"width\":300,\"height\":300,\"caption\":\"GeekHunter\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/x.com\\\/geekhunterbr\",\"https:\\\/\\\/www.instagram.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geekhunter-brasil\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GeekHunterOfficial\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/9f62b173345139f7bbdaf55312c3d400\",\"name\":\"Geekhunter\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"caption\":\"Geekhunter\"},\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/author\\\/matias\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Swift 5: Novidades da Vers\u00e3o - Blog Geekhunter","description":"Nesse artigo falamos sobre as novidades da vers\u00e3o 5.0 da linguagem de desenvolvimento mobile Swift. Quer aprender Swift 5? Leia!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/","og_locale":"pt_BR","og_type":"article","og_title":"O que mudou no Swift 5?","og_description":"Ol\u00e1. Nessa mat\u00e9ria voc\u00ea ir\u00e1 encontrar algumas das novidades da mais recente vers\u00e3o (lan\u00e7ada em Mar\u00e7o de 2019) da linguagem Swift, o Swift 5, utilizada","og_url":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/","og_site_name":"Blog Geekhunter","article_publisher":"https:\/\/www.facebook.com\/geekhunterbr\/","article_published_time":"2025-05-02T15:16:16+00:00","article_modified_time":"2025-05-08T13:57:40+00:00","og_image":[{"width":1366,"height":768,"url":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-Novidades-da-Vers\u00e3o.jpg","type":"image\/jpeg"}],"author":"Geekhunter","twitter_card":"summary_large_image","twitter_creator":"@geekhunterbr","twitter_site":"@geekhunterbr","twitter_misc":{"Escrito por":"Geekhunter","Est. tempo de leitura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#article","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/"},"author":{"name":"Geekhunter","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/9f62b173345139f7bbdaf55312c3d400"},"headline":"O que mudou no Swift 5?","datePublished":"2025-05-02T15:16:16+00:00","dateModified":"2025-05-08T13:57:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/"},"wordCount":2679,"publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-Novidades-da-Vers\u00e3o.jpg","articleSection":["Desenvolvimiento de software"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/","name":"Swift 5: Novidades da Vers\u00e3o - Blog Geekhunter","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#primaryimage"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-Novidades-da-Vers\u00e3o.jpg","datePublished":"2025-05-02T15:16:16+00:00","dateModified":"2025-05-08T13:57:40+00:00","description":"Nesse artigo falamos sobre as novidades da vers\u00e3o 5.0 da linguagem de desenvolvimento mobile Swift. Quer aprender Swift 5? Leia!","breadcrumb":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.geekhunter.com/pt/blog\/o-que-mudou-no-swift-5\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#primaryimage","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/10\/Swift-5-Novidades-da-Vers\u00e3o.jpg","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/10\/Swift-5-Novidades-da-Vers\u00e3o.jpg","width":1366,"height":768,"caption":"fundo roxo com logo da linguagem swift e da geekhunter"},{"@type":"BreadcrumbList","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-mudou-no-swift-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.geekhunter.com/pt/blog\/"},{"@type":"ListItem","position":2,"name":"Mundo TI","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/"},{"@type":"ListItem","position":3,"name":"Desenvolvimiento de software","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/desenvolvimiento-de-software\/"},{"@type":"ListItem","position":4,"name":"O que mudou no Swift 5?"}]},{"@type":"WebSite","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","name":"Blog de TI","description":"Dicas para o RH e profissionais da \u00e1rea TI","publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.geekhunter.com/pt/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization","name":"GeekHunter","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","width":300,"height":300,"caption":"GeekHunter"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geekhunterbr\/","https:\/\/x.com\/geekhunterbr","https:\/\/www.instagram.com\/geekhunterbr\/","https:\/\/www.linkedin.com\/company\/geekhunter-brasil\/","https:\/\/www.youtube.com\/@GeekHunterOfficial"]},{"@type":"Person","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/9f62b173345139f7bbdaf55312c3d400","name":"Geekhunter","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","caption":"Geekhunter"},"url":"https:\/\/www.geekhunter.com\/pt\/blog\/author\/matias\/"}]}},"_links":{"self":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/7580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/comments?post=7580"}],"version-history":[{"count":0,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/7580\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media\/7597"}],"wp:attachment":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media?parent=7580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/categories?post=7580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/tags?post=7580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}