{"id":647,"date":"2016-11-01T16:04:39","date_gmt":"2016-11-01T16:04:39","guid":{"rendered":"http:\/\/jonescarvalho.com\/Blog\/?p=647"},"modified":"2020-05-13T20:50:57","modified_gmt":"2020-05-13T23:50:57","slug":"swift-funcoes-de-alta-ordem","status":"publish","type":"post","link":"https:\/\/jonescarvalho.com\/Blog\/?p=647","title":{"rendered":"Swift &#8211; Fun\u00e7\u00f5es de Alta Ordem"},"content":{"rendered":"<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"swift\">\/\/: # Swift - Fun\u00e7\u00f5es de Alta Ordem\n\/\/: Em Swift, as fun\u00e7\u00f5es s\u00e3o consideradas de primeira classe, visto que elas podem ser passadas com argumentos para outras fun\u00e7\u00f5es, e tamb\u00e9m serem retornadas como fun\u00e7\u00f5es.\\\n\/\/: Esse tipo de fun\u00e7\u00e3o tamb\u00e9m \u00e9 chamada de fun\u00e7ao de alta ordem.\\\n\/\/: As fun\u00e7\u00f5es de alta ordem constituem um conceito central do paradigma da programa\u00e7\u00e3o funcional.\\\n\/\/: Isso quer dizer que a Swift \u00e9 uma linguagem de programa\u00e7\u00e3o funcional?\\\n\/\/: Hum, n\u00e3o exatamente, mas alguma linguagem \u00e9 puramente funcional?\\\n\/\/: Bom, vamos alinhar as expectativas aqui. Neste playground n\u00e3o iremos estudar programa\u00e7\u00e3o funcional, at\u00e9 por que seria um pouco de pretens\u00e3o abordar esse tema rico e complexo em apenas uma aula.\\\n\/\/: Por\u00e9m vamos estudar 3 poderosas fun\u00e7\u00f5es de alta ordem que praticamente existem em todas as linguagem que se dizem funcionais, e que tamb\u00e9m est\u00e3o na Swift.\\\n\/\/: Elas tem uma denomina\u00e7\u00e3o padr\u00e3o que s\u00e3o: `filter`, `map` e `reduce`\\\n\/\/: Essas fun\u00e7\u00f5es efetuam transforma\u00e7\u00f5es gen\u00e9ricas em sequ\u00eancias:\\\n\/\/: A fun\u00e7\u00e3o `filter` filtra elementos conforme um crit\u00e9rio; a fun\u00e7\u00e3o `map` transfere elementos para um outro array aplicando alguma transforma\u00e7\u00e3o, e a fun\u00e7\u00e3o `reduce` reduz uma sequ\u00eancia em um valor simples, aplicando fun\u00e7\u00f5es combinadas para cada elemento da seuq\u00eancia, que deve come\u00e7ar por um valor determinado. Por exemplo, somando todos os elementos de uma sequ\u00eancia, cujo valor inicial \u00e9 zero.\\\n\/\/: Na Swift, essas fun\u00e7\u00f5es s\u00e3o definidas como m\u00e9todos, desde a vers\u00e3o 2.0. E \u00e9 claro que essas fun\u00e7\u00f5es continuar\u00e3o ativas na Swift 3, caso contr\u00e1rio n\u00e3o estar\u00edamos aqui perdendo o nosso tempo.\\\n\/\/: A partir de agora veremos exemplos muito bacanas de cada uma delas.\n\n\/\/: **Filter**\n\n\/\/ Problema: Dado um dicion\u00e1rio com estudantes (nome e nota), descubra e liste aqueles que foram aprovados. Crit\u00e9rio: nota &gt;= 6.0\n\n\/\/ M\u00e9todo tradicional\nvar alunos: Dictionary = [\n\"Rodrigo\": 6.0,\n\"Carlos\": 5.5,\n\"Aline\": 8.0,\n\"Gustavo\": 7.5\n]\n\nfor aluno in alunos {\n\/\/ Verificar se o aluno foi aprovado\nif aluno.1 &gt;= 6.0 {\nprint(\"\\(aluno) foi aprovado\")\n}\n}\n\n\/\/ E com fun\u00e7\u00f5es de alta ordem, com ficaria?\n\/\/ Como temos uma cole\u00e7\u00e3o e um crit\u00e9rio, filter \u00e9 a fun\u00e7\u00e3o de alta ordem mais indicada\nlet aprovados = alunos.filter { $1 &gt;= 6.0 }\naprovados\n\n\/\/ Mais um exemplo de filter\n\n\/\/ Problema: Descobrir os n\u00fameros inteiros pares em uma cole\u00e7\u00e3o\nlet inteiros = [1, 4, 7, 9, 20, 18, 0, 50, 33]\nlet par = inteiros.filter { $0 % 2 == 0 }\npar\n\n\/\/: **Map**\n\n\/\/ Problema: Colocar uma formata\u00e7\u00e3o em um lista de n\u00fameros\n\n\/\/ 1 - Abordagem normal\nlet numeros = [10, 30, 95, 50, 70, 38, 25]\nvar numerosFormatados: [String] = []\n\nfor numero in numeros {\nlet numeroFormatado = \"R$ \\(numero)\"\nnumerosFormatados.append(numeroFormatado)\n}\nnumerosFormatados\n\n\/\/ Com o map...\nlet arrayFormatado = numeros.map { \"R$ \\($0)\" }\narrayFormatado\n\n\/\/: **Reduce**\n\n\/\/ Problema: Combinar v\u00e1rias strings\nlet codigos = [\"abc\", \"def\", \"ghi\"]\nlet texto = codigos.reduce(\"CodigoMaster: \", +)\n\n\/\/ Problema: Somat\u00f3ria de N\u00fameros\nlet itens = [2.0, 4.0, 5.0, 7,0]\nlet total = itens.reduce(0.0, +)<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\/\/: # Swift &#8211; Fun\u00e7\u00f5es de Alta Ordem \/\/: Em Swift, as fun\u00e7\u00f5es [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[51,52,50,48,40,49,39],"class_list":["post-647","post","type-post","status-publish","format-standard","hentry","category-dicas","tag-arrays","tag-dictionary","tag-filter","tag-funcoes","tag-ios","tag-lambda","tag-swift"],"_links":{"self":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/647"}],"collection":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=647"}],"version-history":[{"count":5,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/647\/revisions"}],"predecessor-version":[{"id":847,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/647\/revisions\/847"}],"wp:attachment":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}