{"id":635,"date":"2016-11-01T13:23:39","date_gmt":"2016-11-01T13:23:39","guid":{"rendered":"http:\/\/jonescarvalho.com\/Blog\/?p=635"},"modified":"2020-05-13T20:52:04","modified_gmt":"2020-05-13T23:52:04","slug":"swift-tuplas-e-optionals","status":"publish","type":"post","link":"https:\/\/jonescarvalho.com\/Blog\/?p=635","title":{"rendered":"Swift &#8211; Tuplas e Optionals"},"content":{"rendered":"<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"swift\">\/\/ 1 - Tuplas (Tuples)\n\n\/*\nTuplas - Uma das novidades da linguagem Swift\nElas agrupam valores em um \u00fanico elemento\nOs valores podem ser de qualquer tipo de dados\n*\/\n\nlet codErro = 404\nlet descErro = \"Not Found\"\n\n\/\/ Com a tupla, conseguimos definir tipos diferentes em um mesmo elemento\nlet http404Error = (404, \"Not Found\")\n\/\/ http404Error \u00e9 do tipo (Int, String)\n\n\/\/ Como exibir as informa\u00e7\u00f5es?\n\/\/ 1 - Por decomposi\u00e7\u00e3o\nlet (statusCode, statusMessage) = http404Error\nprint(\"O c\u00f3digo de erro \u00e9 \\(statusCode)\")\nprint(\"A mensagem de erro \u00e9 \\(statusMessage)\")\n\n\/\/ 2 - Por \u00edndice\nprint(\"O c\u00f3digo de erro \u00e9 \\(http404Error.0)\")\nprint(\"A mensagem de erro \u00e9 \\(http404Error.1)\")\n\n\/\/ Podem ser atribu\u00eddos nomes aos campos\nlet httpStatus = (statusCode: 200, descricao: \"OK\")\n\n\/\/ Exibindo as informa\u00e7\u00f5es pelo nome\nprint(\"O c\u00f3digo de retorno \u00e9 \\(httpStatus.statusCode)\")\nprint(\"A mensagem de retorno \u00e9 \\(httpStatus.statusCode)\")\n\n\/*\nOptionals\nOutro novo recurso da linguagem Swift, visando tornar os apps mais seguros e\n\nmenos sujeitos a falhas\n\nOs Optionals s\u00e3o utilizados em situa\u00e7\u00f5es onde pode haver valores inesperados ou\n\naus\u00eancia de valor\nEm um Optional, dizemos que:\n1) H\u00e1 um valor, e ele \u00e9 ugial a (x), OU\n2) N\u00e3o h\u00e1 um valor, absolutamente (valueless)\n*\/\n\n\/\/ Inicialmente, veremos um c\u00f3digo sem prote\u00e7\u00e3o, onde a finalidade \u00e9 converter uma\n\n\/\/string em um inteiro, e posterormente efetuar um c\u00e1lculo com esse valor\nlet possivelNumero: String = \"abc\"\n\/\/var numeroConvertido = Int(possivelNumero)\n\/\/ numeroConvertido foi inferido para Int\n\n\/\/numeroConvertido! += 10\n\/\/ Forced Wrapping - \"garanto\" que n\u00e3o haver\u00e1 aus\u00eancia de valor - assumo a responsabilidade\n\n\/\/ Verifica\u00e7\u00e3o reativa\n\/\/if numeroConvertido != nil {\n\/\/ numeroConvertido! += 10\n\/\/ print(numeroConvertido)\n\/\/} else {\n\/\/ print(\"N\u00e3o foi poss\u00edvel converter o valor\")\n\/\/}\n\n\/\/ Para tratar com Optionals, a melhor forma \u00e9 ser pro-ativo\n\n\/\/ Solu\u00e7\u00e3o mais sustent\u00e1vel\n\/\/ Atrav\u00e9s do recurso que se chama Optional Binding\nif let numeroReal = Int(possivelNumero) {\nprint(\"O valor da vari\u00e1vel convertida \u00e9 \\(numeroReal)\")\nprint(numeroReal)\n} else {\nprint(\"N\u00e3o foi poss\u00edvel converter o valor\")\n}\n\n\/\/ Como indicar que um elemento pode ser um Optional\n\/\/ Atrv\u00e9s do uso do ponto de interroga\u00e7\u00e3o (?)\nlet nomeUsuario: String?\n\nnomeUsuario = \"Jones\"\n\n\/\/let cumprimento = \"Ol\u00e1 \" + nomeUsuario + \". Seja bem-vindo\"\n\/\/print(cumprimento)\n\n\/\/ DESAFIO\n\/\/ Como resolver a situa\u00e7\u00e3o acima de forma segura?\n\n\/\/ Verificar se nomeUsuario tem um valor v\u00e1lido antes de trabalhar com ele\n\/\/ Na Swift, atrav\u00e9s do Optional Binding\nif let nomeValido = nomeUsuario {\nlet cumprimento = \"Ol\u00e1 \" + nomeValido + \". Seja bem-vindo\"\nprint(cumprimento)\n} else {\nprint(\"Nome de Usu\u00e1rio tem um valor inv\u00e1lido ou aus\u00eancia de valor\")\n}\n\n\/\/ Mais um exemplo de Optional, efetuando uma dupla verifica\u00e7\u00e3o\nvar nome: String?\nvar sobreNome: String?\n\nnome = \"Jones \"\nsobreNome = \"Carvalho\"\n\n\/\/ Iremos utilizar o Optional Binding para garantir que os campos tenha valor v\u00e1lido\nif let primeiroNome = nome, let segundoNome = sobreNome {\nlet nomeCompleto = primeiroNome + segundoNome\n} else {\nprint(\"H\u00e1 algum problema com os nomes. Favor verificar\")\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\/\/ 1 &#8211; Tuplas (Tuples) \/* Tuplas &#8211; Uma das novidades da linguagem [&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,42,39,41],"class_list":["post-635","post","type-post","status-publish","format-standard","hentry","category-dicas","tag-ios","tag-optional","tag-swift","tag-tuplas"],"_links":{"self":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/635"}],"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=635"}],"version-history":[{"count":3,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/635\/revisions"}],"predecessor-version":[{"id":851,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/635\/revisions\/851"}],"wp:attachment":[{"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jonescarvalho.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}