{"id":486,"date":"2017-12-07T06:00:26","date_gmt":"2017-12-07T05:00:26","guid":{"rendered":"http:\/\/www.programaraciegas.net\/?p=486"},"modified":"2017-11-30T05:57:13","modified_gmt":"2017-11-30T04:57:13","slug":"control-de-flujo-de-la-aplicacin-usando-estructuras-condicionales","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=486","title":{"rendered":"Control de flujo de la aplicaci&oacute;n usando estructuras condicionales en Swift"},"content":{"rendered":"<p>En Swift al igual que en otros lenguajes de programaci&oacute;n la ejecuci&oacute;n de un programa cambia seg&uacute;n se vayan cumpliendo una serie de condiciones. Por esta raz&oacute;n todos los lenguajes de programaci&oacute;n incluyen alg&uacute;n tipo de estructura condicional para poder controlar el flujo de ejecuci&oacute;n de nuestro programa.<\/p>\n<p>La mayor&iacute;a de estructuras condicionales cumplen esta estructura:<\/p>\n<p><pre>\r\nSi se cumple una condici&oacute;n\r\nentonces haz algo\r\n<\/pre>\n<\/p>\n<p>Esto en Swift se consigue con la sentencia <strong>if<\/strong> y su sint&aacute;xis es la siguiente:<\/p>\n<p><code><br \/>\nif condicionVerdadera {<br \/>\n  \/\/ Codigo a ejecutar si se cumple la condicion<br \/>\n}<br \/>\n<\/code><\/p>\n<p>La condici&oacute;n siempre ser&aacute; una comparaci&oacute;n booleana (devolver&aacute; verdadero o falso) y s&oacute;lo se ejecutar&iacute;a el c&oacute;digo entre llaves si la comparaci&oacute;n es verdadera.<\/p>\n<p>Veamos un ejemplo sencillo.<\/p>\n<p><code><br \/>\n\/*<br \/>\n  Playground de ejemplo de condicionales<br \/>\n*\/<br \/>\nlet num1 = 23<br \/>\nlet num2 = 33<\/p>\n<p>if num1 < num2 {\n  print(\"Num1 es menor que num2\")\n}\nif num1 > num2 {<br \/>\n  print(\"Num1 es mayor que num2\")<br \/>\n}<br \/>\nif num1 == num2 {<br \/>\n  print(\"Num1 es igual que num2\")<br \/>\n}<br \/>\n<\/code><\/p>\n<h3>Comparaciones en Swift<\/h3>\n<p>La mayor&iacute;a de comparaciones que se realizan en Swift son comparaciones de valores almacenados por variables u objetos. En Swift tenemos inicialmente las siguientes operaciones de comparaci&oacute;n:<\/p>\n<dl>\n<dt>==<\/dt>\n<dd>Igual a<\/dd>\n<dt>!=<\/dt>\n<dd>distinto de<\/dd>\n<dt>&lt;<\/dt>\n<dd>Menor que<\/dd>\n<dt>&gt;<\/dt>\n<dd>mayor que<\/dd>\n<dt>&lt;=<\/dt>\n<dd>Menor o igual que<\/dd>\n<dt>&gt;=<\/dt>\n<dd>mayor o igual que<\/dd>\n<\/dl>\n<p>Con este conjunto de comparaciones podemos resolver la mayor&iacute;a de progremas de cualquier aplicaci&oacute;n.<\/p>\n<h3>&Aacute;mbitos en Swift<\/h3>\n<p>En Swift el uso de las llaves (<em>{ }<\/em>) se utiliza para agrupar un trozo de c&oacute;digo que pertenecer&aacute; a un mismo &aacute;mbito.<\/p>\n<p>Los &aacute;mbitos no s&oacute;lo se utilizan para determinar qu&eacute; conjunto de &oacute;rdenes pertenecen a una funci&oacute;n, parte de c&oacute;digo a ejecutar si se cumple una condici&oacute;n o qu&eacute; funciones y propiedades pertenecen a una clase. Un &aacute;mbito tambi&eacute;n determina qu&eacute; recursos est&aacute;n fuera y dentro del &aacute;mbito. Esto significa que podemos usar variables y constantes que est&eacute;n por encima del &aacute;mbito pero todo aquello que declaremos dentro del &aacute;mbito no podr&aacute; ser utilizado fuera de &eacute;l.<\/p>\n<p>Veamos esto en un ejemplo de c&oacute;digo.<\/p>\n<p><code><br \/>\n\/*<br \/>\n  Playground de ejemplo de ambitos en Swift<br \/>\n*\/<\/p>\n<p>let numFuera = 3<br \/>\ndo {<br \/>\n  let numDentro = 5<br \/>\n  print(\"fuera= \\(numFuera) dentro = \\(numDentro)\")<br \/>\n}<br \/>\nprint(\"fuera= \\(numFuera) dentro = \\(numDentro)\")<br \/>\n<\/code><\/p>\n<p>Si intentamos ejecutar el c&oacute;digo anterior obtendremos el siguiente error:<\/p>\n<p><pre>\r\nPlayground execution failed:\r\n\r\nerror: PlayGroundTest.playground:4:38: error: use of unresolved identifier 'numDentro'\r\nprint(\"fuera= \\(numFuera) dentro = \\(numDentro)\")\r\n                                     ^~~~~~~~~\r\n<\/pre>\n<\/p>\n<p>Esto se debe a que en la &uacute;ltima l&iacute;nea de c&oacute;digo, en el segundo uso de la funci&oacute;n print() estamos haciendo referencia a la constante <em>numDentro<\/em> que est&aacute; declarada dentro de un &aacute;mbito y esa funci&oacute;n print() est&aacute; siendo ejecutada fuera de ese &aacute;mbito.<\/p>\n<p>Veremos m&aacute;s adelante m&aacute;s detalles de los &aacute;mbitos. Por ahora s&oacute;lo nos interesa saber que las llaves nos permiten crear bloques de c&oacute;digo agrupado y que los recursos creados y declarados dentro de un bloque son para ser utilizados dentro de ese bloque o dentro de los sub bloques que contenga.<\/p>\n<h3>Encadenando y anidando condicionales<\/h3>\n<p>Relacionada con la sentencia <strong>if<\/strong> tenemos la sentencia <strong>else<\/strong> que nos permite ejecutar un bloque de c&oacute;digo si no se cumple la condici&oacute;n que estamos evaluando. Ser&iacute;a algo como:<\/p>\n<p><pre>\r\nSi se cumple una condici&oacute;n\r\n  entonces haz algo\r\nSi no \r\n  entonces haz otra cosa\r\n<\/pre>\n<\/p>\n<p>Con la sint&aacute;xis de Swift el ejemplo ser&iacute;a el siguiente:<\/p>\n<p><code><br \/>\nif condicionVerdadera {<br \/>\n  \/\/ Codigo a ejecutar si se cumple la condicion<br \/>\n} else {<br \/>\n  \/\/ Codigo a ejecutar si no se cumple la condicion<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Un ejemplo pr&aacute;ctico podr&iacute;a ser este:<\/p>\n<p><code><br \/>\n\/*<br \/>\n  Playground de ejemplo de condicionales<br \/>\n*\/<br \/>\nlet num1 = 23<br \/>\nlet num2 = 33<\/p>\n<p>if num1 < num2 {\n  print(\"Num1 es menor que num2\")\n} else {\n  print(\"Num1 no es menor que num2\")\n}\n<\/code><\/p>\n<p>Podemos encadenar varios <strong>else if<\/strong> para optimizar nuestro c&oacute;digo. Nuestro ejemplo inicial quedar&iacute;a de la siguiente forma:<\/p>\n<p><code><br \/>\n\/*<br \/>\n  Playground de ejemplo de condicionales<br \/>\n*\/<br \/>\nlet num1 = 23<br \/>\nlet num2 = 33<\/p>\n<p>if num1 < num2 {\n  print(\"Num1 es menor que num2\")\n}\nelse if num1 > num2 {<br \/>\n  print(\"Num1 es mayor que num2\")<br \/>\n}<br \/>\nelse if num1 == num2 {<br \/>\n  print(\"Num1 es igual que num2\")<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Adem&aacute;s dentro de un dominio de una condici&oacute;n podemos incluir nuevas condiciones creando condiciones anidadas. Veamos un ejemplo pr&aacute;ctico<\/p>\n<p><code><br \/>\n\/*<br \/>\n  Playground de ejemplo de condicionales<br \/>\n*\/<br \/>\nlet num1 = 23<br \/>\nlet num2 = 33<\/p>\n<p>if num1 < num2 {\n  if num1 == 23 {\n    print(\"Num1 es menor que num2 y num1 tiene el valor 23\")\n  } else {\n    print(\"Num1 es menor que num2\")\n  }\n} else {\n  print(\"Num1 no es menor que num2\")\n}\n<\/code><\/p>\n<h2>Realizando varias comparaciones a la vez<\/h2>\n<p>En algunas ocasiones puede que una condici&oacute;n consista en el resultado de varias comparaciones. Swift, al igual que otros lenguajes de programaci&oacute;n nos permite conjuntar comparaciones para crear una condici&oacute;n compuesta.<\/p>\n<p>Para poder crear estas uniones entre comparaciones tenemos las palabras <em>AND<\/em> y <em>OR<\/em> qe nos permiten crearr combinaciones m&aacute;s complejas. Pero en Swift en lugar de utilizar la palabra <em>AND<\/em> debemos usar el doble s&iacute;mbolo de ampersand (<em>&amp;&amp;<\/em>) y para la palabra <em>OR<\/em> debemos usar el doble s&iacute;mbolo de l&iacute;nea vertical (<em>||<\/em>).<\/p>\n<p>Si utilizamos el <em>AND<\/em> indicamos que ambas comparaciones deben cumplirse para que la condici&oacute;n sea verdadera. Pero si utilizamos el <em>OR<\/em> s&oacute;lo necesitamos que se cumpla una de las comparaciones para considerar que la condici&oacute;n se cumple.<\/p>\n<p>Veamos un ejemplo de c&oacute;digo<\/p>\n<p><code><br \/>\n\/*<br \/>\n  Playground de ejemplo de condiciones compuestas<br \/>\n*\/<\/p>\n<p>let num1 = 10<br \/>\nlet num2 = 20<br \/>\nvar num3 = num2 \/ num1<br \/>\nvar num4 = 2<\/p>\n<p>if num1 < num2 &#038;&#038; num3 == num4 {\n  print(\"num1 es menor que num2 y num3 es igual que num4\")\n} else {\nprint(\"No se cumple la condici\u00f3n de num1 es menor que num2 y num3 es igual que num4\")\n}\n\/\/ cambiamos el valor de num4\nnum4 = 4\nif num1 < num2 &#038;&#038; num3 == num4 {\n  print(\"num1 es menor que num2 y num3 es igual que num4\")\n} else {\nprint(\"No se cumple la condici\u00f3n de num1 es menor que num2 y num3 es igual que num4\")\n}\n\n\/\/ Cambiamos and por or\nif num1 < num2 || num3 == num4 {\n  print(\"num1 es menor que num2 o num3 es igual que num4\")\n} else {\nprint(\"No se cumple la condici\u00f3n de num1 es menor que num2 o num3 es igual que num4\")\n}\n<\/code><\/p>\n<p>Al ejecutar este c&oacute;digo obtendremos este resultado:<\/p>\n<p><pre>\r\nnum1 es menor que num2 y num3 es igual que num4\r\nNo se cumple la condici\u00f3n de num1 es menor que num2 y num3 es igual que num4\r\nnum1 es menor que num2 o num3 es igual que num4\r\n<\/pre>\n<\/p>\n<h2>Conclusiones<\/h2>\n<p>En este art&iacute;culo hemos aprendido lo siguiente:<\/p>\n<ul>\n<li>Qu&eacute; es un control de flujo<\/li>\n<li>Qu&eacute; es un &aacute;mbito en Swift<\/li>\n<li>C&oacute;mo podemos comparar variables y valores<\/li>\n<li>C&oacute;mo anidar y encadenar controles de flujo<\/li>\n<\/ul>\n<p>El uso de los bloques de control de flujo son indispensables para poder crear aplicaciones que hagan algo m&aacute;s que mostrar valores por pantalla por lo que es muy importante dominar bien este aspecto de la programaci&oacute;n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En Swift al igual que en otros lenguajes de programaci&oacute;n la ejecuci&oacute;n de un programa cambia seg&uacute;n se vayan cumpliendo una serie de condiciones. Por esta raz&oacute;n todos los lenguajes de programaci&oacute;n incluyen alg&uacute;n tipo de estructura condicional para poder controlar el flujo de ejecuci&oacute;n de nuestro programa. La mayor&iacute;a de estructuras condicionales cumplen esta &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=486\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abControl de flujo de la aplicaci&oacute;n usando estructuras condicionales en Swift\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,258],"tags":[259],"class_list":["post-486","post","type-post","status-publish","format-standard","hentry","category-programacion","category-swift","tag-swift"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=486"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/486\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}