{"id":641,"date":"2016-11-01T13:34:40","date_gmt":"2016-11-01T13:34:40","guid":{"rendered":"http:\/\/jonescarvalho.com\/Blog\/?p=641"},"modified":"2020-05-13T20:51:35","modified_gmt":"2020-05-13T23:51:35","slug":"swift-closures","status":"publish","type":"post","link":"https:\/\/jonescarvalho.com\/Blog\/?p=641","title":{"rendered":"Swift &#8211; Closures"},"content":{"rendered":"<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"swift\">\/\/ Swift - Closures\n\n\/*\nDefini\u00e7\u00e3o:\nClosures s\u00e3o blocos independentes de funcionalidade que podem ser utilizados em nosso c\u00f3digo\nS\u00e3o equivalentes aos blocos em Obj-C e lambdas em outras linguagens\nA Closure \u00e9 como se fosse uma fun\u00e7\u00e3o sem nome\nEst\u00e3o sendo muito utilizadas pela Apple para tratar eventos ass\u00edncronos nos Apps, como Completion Handlers (blocos de c\u00f3digo que s\u00e3o executados quando eventos ass\u00edncronos s\u00e3o completados)\nEntenda que como uma closure \u00e9 armazenada separadamente pelo iOS, ele pode ser chamada a qualquer momento pelo sistema operacional, por manter seu estado original.\n\nDeclarando uma closure:\n\nSintaxe mais utilizada:\n{ (parameters) -&gt; return type in\nstatements\n}\n\nSe a closure n\u00e3o retornar valor, a \"-&gt;\" pode ser omitida\n{ (parameters) in\nstatements\n}\n\nOBS: \u00c9 mais comum o desenvolvedor utilizar uma closure declarada em classes do iOS do que definir suas pr\u00f3prias closures. Mesmo assim, \u00e9 muito importante entender como ela funciona.\n\n*\/\n\n\/\/ Exemplo de uma closure sem par\u00e2metros\nlet swiftClosure = {\nprint(\"Bem-vindos \u00e0s closures em Swift\")\n}\n\n\/\/ Chamando a closure\nswiftClosure()\n\n\/\/ Uma closure com dois par\u00e2metros e valor de retorno\nlet divide = {\n(val1: Int, val2: Int) -&gt; Int in\nreturn val1 \/ val2\n}\n\n\/\/ Executa a closure\nlet resultado = divide(200, 20)\nprint(resultado)\n\n\/\/ V\u00e1rias formas de sintaxe\n\n\/\/ 1\u00aa forma - mais completa\nlet idadeCanina1 = {\n(idadeHumana: Int) -&gt; Int in\nreturn idadeHumana + 7\n}\n\n\/\/ 2\u00aa forma - 1\u00ba n\u00edvel de simplifica\u00e7\u00e3o\nlet idadeCanina2 = {\n(idadeHumana) in\nreturn idadeHumana + 7\n}\n\n\/\/ 3\u00aa forma - 2\u00ba n\u00edvel de simplifica\u00e7\u00e3o\nlet idadeCanina3 = { return $0 + 7 }\n\n\/\/ 4\u00aa forma - exagero total de simplifica\u00e7\u00e3o\nlet idadeCanina4 = { $0 + 7 }\n\n\/\/ Para receber o retorno das chamadas\nvar idadeCalculada: Int?\n\n\/\/ Chamadas\nidadeCalculada = idadeCanina1(10)\nidadeCalculada = idadeCanina2(10)\nidadeCalculada = idadeCanina3(10)\nidadeCalculada = idadeCanina4(10)\n\n\/\/ Minha opini\u00e3o - a melhor forma \u00e9 a 2, pois fica claro que \u00e9 uma closure pois aparece a palavra \"in\"\n\/\/ Trailing Closures\n\n\/*\nQuando passamos uma express\u00e3o closure para uma fun\u00e7\u00e3o, onde a closure \u00e9 o \u00faltimo par\u00e2metro, chamamos essa closure de Trailing Closure\nA trailing closure pode ser escrita como \u00faltimo par\u00e2metro, antes do par\u00eantesis de fechamento, ou escrita fora (e depois) dos par\u00eantesis da fun\u00e7\u00e3o principal\n\u00c9 a sintaxe utilizada pelos Completion Handlers, utilizados para o tratamento de eventos ass\u00edncronos em um App, que podem levar um certo tempo para serem executados antes de retornar os resultados do processamento\n--&gt; utilizaremos muito essa sintaxe no curso SDK\n*\/\n\n\/\/ Exemplo\n\/\/ Declara\u00e7\u00e3o de uma fun\u00e7\u00e3o que recebe uma closure como par\u00e2metro\n\/\/ Como a closure \u00e9 o \u00faltimo par\u00e2metro, \u00e9 chamada de Trailing Closure\n\/\/ A closure cont\u00e9m um par\u00e2metro booleano (Bool) e n\u00e3o tem retorno (Void)\nfunc isTextValid(input: String, completionHandler: (Bool) -&gt; Void) {\n\n\/\/ Processamento da Closure\nif input == \"Instituto de Artes Interativas\" {\ncompletionHandler(true)\n} else {\ncompletionHandler(false)\n}\n}\n\n\/\/ Chamada da fun\u00e7\u00e3o, passando uma Trailing Closure como \u00faltimo par\u00e2metro\n\/\/ Observe que a closure est\u00e1 definida entre chaves, no par\u00e2metro Completion Handler\nisTextValid(input: \"Instituto de Artes Interativas\", completionHandler: { (result: Bool) -&gt; Void in\n\n\/\/ Processamento ap\u00f3s a execu\u00e7\u00e3o da Closure\nif result {\nprint(\"Estamos no iai?\")\n} else {\nprint(\"Ops, mas a aula \u00e9 online\")\n}\n})\n\n\/\/ Chamada (simplificada) da fun\u00e7\u00e3o, passando uma Trailing Closure como par\u00e2metro\n\/\/ O resultado \u00e9 o mesmo\nisTextValid(input: \"Instituto de Artes Interativas\") { (result) in\n\n\/\/ Tratamento de retorno da closure\nif result {\nprint(\"Estamos no iai?\")\n} else {\nprint(\"Ops, mas a aula \u00e9 online.\")\n}\n\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\/\/ Swift &#8211; Closures \/* Defini\u00e7\u00e3o: Closures s\u00e3o blocos independentes de funcionalidade que [&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":[40,39],"class_list":["post-641","post","type-post","status-publish","format-standard","hentry","category-dicas","tag-ios","tag-swift"],"_links":{"self":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/641"}],"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=641"}],"version-history":[{"count":2,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/641\/revisions"}],"predecessor-version":[{"id":849,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/641\/revisions\/849"}],"wp:attachment":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}