Icono del sitio Swift Latino

Estructuras en Swift

Estructuras Swift struct

<p>Swift provee otro tipo de dato que el programador puede utilizar para crear tipos compuestos&comma; muy parecidos a las clases pero que tienen algunas diferencias&period; En este capítulo vamos a estar hablando de las estructuras en Swift&period; Como muchos de los puntos ya fueron explicados en el capítulo de clases&comma; trataremos de ser más concisos esta vez&period;<&sol;p>&NewLine;<&excl;--TOC-->&NewLine;<h2>Definición de estructura<&sol;h2>&NewLine;<p>Si quisiéramos definir de una forma rápida qué es una estructura&comma; podríamos decir que se trata de un tipo de dato que permite agrupar varios elementos de distinto tipo bajo un mismo nombre&period; En este sentido&comma; podríamos tener una estructura compuesta un por un String&comma; un Int y un Bool&comma; por solo dar un ejemplo&period;<&sol;p>&NewLine;<p>Si bien esto es cierto para la mayoría de los lenguajes de programación&comma; en Swift una estructura es muy parecida a las clases ya que poseen varios puntos en común&period; Uno de los más importantes es que se pueden incluir métodos o funciones a las estructuras en Swift&period;<&sol;p>&NewLine;<p>Por lo tanto&comma; una mejor definición sería que las estructuras&comma; al igual que las clases&comma; son bloques flexibles y de propósito general que definen el comportamiento general de una aplicación&period;<&sol;p>&NewLine;<p>A su vez&comma; existen varias diferencias entre las clases y estructuras&period; Una de las más importantes es que las estructuras no permiten la herencia entre ellas&comma; como vimos en el capítulo de Clases en Swift&period;<&sol;p>&NewLine;<h2>Estructuras en Swift – Sintaxis<&sol;h2>&NewLine;<p>Para poder crear una estructura se utiliza la palabra reservada struct seguido del nombre de la misma&period; Como se trata de un tipo de dato&comma; se espera&comma; según la convención de nombres&comma; que su nombre comience con una letra mayúscula&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct UnaEstructura &lbrace;<&sol;p>&NewLine;<p>&sol;&sol;Definición de la estructura<&sol;p>&NewLine;<p>&rcub;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>De manera contraria&comma; todas las funciones que la estructura contenga deberán nombrarse usando una letra en minúscula al inicio&period; En todos los casos&comma; si los nombres a usar contienen más de una palabra&comma; no se deberán usar ningún separador entre ellas &lpar;como guiones o barras&rpar; sino que se deberá usar mayúsculas para la primer letra de cada palabra &lpar;notación camel case&rpar;&period;<&sol;p>&NewLine;<p>Veamos un ejemplo de una estructura&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Ubicacion &lbrace;<br &sol;>&NewLine;var latitud&colon;Double &equals; -34&period;599722<br &sol;>&NewLine;var longitud&colon;Double &equals; -58&period;381944<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>En este caso estamos creando una estructura llamada Ubicación que contiene dos variables del tipo Double&semi; una para marcar la longitud y otro para la latitud&comma; a los cuales se les asigna un valor correspondiente a la ubicación de Buenos Aires en Argentina&period;<&sol;p>&NewLine;<h2>Estructuras en Swift – proceso de inicialización<&sol;h2>&NewLine;<p>Como vimos en el capítulo de clases&comma; crear una instancia implica asignar un espacio en memoria para que la clase o estructura tenga entidad propia y así poder usar sus elementos&period; La forma de hacerlo es crear una variable o constante del tipo de esa clase o estructura y usar de ahí en más la variable o constante en cuestión&comma; haciendo uso de todos los elementos que fueron declarados y programados para esa clase o estructura&period;<&sol;p>&NewLine;<h3>Inicializador por defecto<&sol;h3>&NewLine;<p>La forma más simple y básica de crear una instancia de una estructura es mediante el uso del nombre de la misma seguido de paréntesis&comma; lo que corresponde al inicializador por defecto&comma; como vemos a continuación&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;let buenosAires &equals; Ubicacion&lpar;&rpar;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>En el ejemplo&comma; estamos creando una constante llamada buenosAires a la cual se le asigna una estructura del tipo Ubicación&period;<&sol;p>&NewLine;<p>Para poder acceder a sus atributos&comma; simplemente hacemos referencia a ellos usando un punto seguido de la propiedad que queremos usar&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;print&lpar;«Buenos Aires se sitúa en la longitud &bsol;&lpar;buenosAires&period;longitud&rpar;»&rpar;<&sol;p>&NewLine;<p>&sol;&sol;Devuelve&colon;<br &sol;>&NewLine;&sol;&sol;Buenos Aires se sitúa en la longitud -58&period;381944<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Los inicializadores por defecto pueden usarse para aquellas estructuras que no tengan definido un inicializador y que tengan todas sus propiedades asignadas a valores por default&period; Esto se debe a que el inicializador por defecto crea una instancia con todas las propiedades asignadas a esos valores ya definidos en la estructura&period;<&sol;p>&NewLine;<h3>Inicializador de miembro<&sol;h3>&NewLine;<p>En el caso de tener una estructura a la cual no se le haya definido ningún inicializador&comma; se puede hacer uso del inicializador de miembro&comma; el cual permite pasar por parámetro los valores iniciales de las propiedades al momento de crear la instancia&period;<&sol;p>&NewLine;<p>A diferencia del inicializador por defecto&comma; en este caso podemos usarlo incluso si las propiedades de la estructura no tienen valores default&period;<&sol;p>&NewLine;<p>En este sentido&comma; usando el ejemplo de arriba&comma; podemos generar una instancia de la siguiente manera&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;let unaUbicacion &equals; Ubicacion&lpar;latitud&colon; -34&period;454345345&comma; longitud&colon; -53&period;34234235&rpar;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<h3>Inicializador personalizado<&sol;h3>&NewLine;<p>En muchos casos&comma; al momento de crear una instancia necesitamos editar algunos puntos del comportamiento del mismo para realizar cálculos usando los valores pasados por parámetro para las propiedades&comma; en general para completar otras propiedades cuyo valor es calculable&period;<&sol;p>&NewLine;<p>Para poder resolver esta problemática&comma; tenemos los llamados inicializadores personalizados&comma; que son unas funciones que se ejecutan al momento de crear la instancia de la estructura&comma; en donde podemos <em>customizar<&sol;em> el comportamiento a nuestro antojo&period; Para ello&comma; usamos la palabra reservada init seguida de paréntesis&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Ubicacion &lbrace;<br &sol;>&NewLine;var latitud&colon;Double &equals; -34&period;599722<br &sol;>&NewLine;var longitud&colon;Double &equals; -58&period;381944<br &sol;>&NewLine;var hemisferio&colon;String&quest;<&sol;p>&NewLine;<p>init&lpar;latitud&colon;Double&comma; longitud&colon;Double&rpar; &lbrace;<br &sol;>&NewLine;self&period;latitud &equals; latitud<br &sol;>&NewLine;self&period;longitud &equals; longitud<&sol;p>&NewLine;<p>if latitud &gt&semi; 0 &lbrace;<br &sol;>&NewLine;hemisferio &equals; «Norte»<br &sol;>&NewLine;&rcub; else &lbrace;<br &sol;>&NewLine;hemisferio &equals; «Sur»<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Como vemos&comma; estamos creando un inicializador que recibe por parámetro una latitud y longitud de manera de poder sobreescribir los valores por defecto que tienen las propiedades de la estructura &lpar;las cuales son referenciadas inequívocamente usando la palabra reservada self&rpar;&period; Hasta aquí&comma; estamos emulando el inicializador de miembro visto anteriormente&period; Sin embargo&comma; la funcionalidad extra que estamos agregando es la de decidir si la ubicación en cuestión corresponde al hemisferio Norte o al Sur&period;<&sol;p>&NewLine;<p>Cabe destacar&comma; que si creamos un inicializador personalizado&comma; ya no podremos usar los otros vistos anteriormente &lpar;el de miembro y el que Swift provee por defecto&rpar;&period; En el caso de querer usarlos de todas maneras&comma; tendremos que programarlos&period;<&sol;p>&NewLine;<p>Un punto muy importante a tener en cuenta es que si alguno de los inicializadores creados por nosotros tiene la misma definición que el inicializador de miembro&comma; no podremos usar ambos al mismo tiempo ya que entrarían en conflicto&period; Para más información&comma; ver el capítulo de funciones en Swift&period;<&sol;p>&NewLine;<p>La siguiente estructura corresponde a la misma que venimos trabajando a la cual se le agrega el inicializador por defecto únicamente&comma; ya que el otro no puede ser incluido como tal por lo explicado en el párrafo anterior&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Ubicacion &lbrace;<&sol;p>&NewLine;<p>var latitud&colon;Double &equals; -34&period;599722<br &sol;>&NewLine;var longitud&colon;Double &equals; -58&period;381944<br &sol;>&NewLine;var hemisferio&colon;String&quest;<&sol;p>&NewLine;<p>init&lpar;latitud&colon;Double&comma; longitud&colon;Double&rpar; &lbrace;<br &sol;>&NewLine;self&period;latitud &equals; latitud<br &sol;>&NewLine;self&period;longitud &equals; longitud<&sol;p>&NewLine;<p>if latitud &gt&semi; 0 &lbrace;<br &sol;>&NewLine;hemisferio &equals; «Norte»<br &sol;>&NewLine;&rcub; else &lbrace;<br &sol;>&NewLine;hemisferio &equals; «Sur»<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>&sol;&sol;Inicializador por defecto<br &sol;>&NewLine;init&lpar;&rpar; &lbrace;<&sol;p>&NewLine;<p>&rcub;<&sol;p>&NewLine;<p>&sol;&ast;<br &sol;>&NewLine;Este no puede ser incluido ya que tiene la misma definición que el primer inicializador<br &sol;>&NewLine;&sol;&sol;Inicializador de miembro<br &sol;>&NewLine;init&lpar;latitud&colon;Double&comma; longitud&colon;Double&rpar; &lbrace;<br &sol;>&NewLine;self&period;latitud &equals; latitud<br &sol;>&NewLine;self&period;longitud &equals; longitud<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&ast;&sol;<&sol;p>&NewLine;<p>&rcub;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<h2>Estructura en Swift – tipos por valor<&sol;h2>&NewLine;<p>Las estructuras&comma; al igual que las enumeraciones que veremos en un capítulo posterior&comma; son tipos por valor&period; Esto quiere decir que cada vez que asignamos una estructura a una variable o constante&comma; o cuando esa estructura es pasada por parámetro a una función&comma; el valor es copiado&period;<&sol;p>&NewLine;<p>Este concepto es muy importante y para entenderlo bien lo vamos a ver con un ejemplo&period; Supongamos que tenemos una estructura Empleado y que creamos una instancia de ella&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Empleado &lbrace;<br &sol;>&NewLine;var nombre&colon;String<br &sol;>&NewLine;var edad&colon;Int<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>var steve &equals; Empleado&lpar;nombre&colon; «Steve»&comma; edad&colon; 50&rpar;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Lo que sucede es que en la memoria se está creando un espacio en donde se guardan los datos de la instancia steve&period; Si copiamos esa estructura en otra constante o variable&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;let otroSteve &equals; steve<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>lo que estamos logrando es la creación de otro espacio en memoria distinto en donde se copian todos los datos de la estructura original&period; Por lo tanto&comma; si modificamos uno de ellos&comma; el otro no se ve afectado por tratarse de instancias distintas que apuntan a espacios de memoria distintos&period;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;steve&period;nombre &equals; «Bill»<&sol;p>&NewLine;<p>print&lpar;«&bsol;&lpar;steve&period;nombre&rpar;»&rpar; &sol;&sol; Bill<br &sol;>&NewLine;print&lpar;«&bsol;&lpar;otroSteve&period;nombre&rpar;»&rpar; &sol;&sol; Steve<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Este comportamiento es completamente distinto al de las clases ya que éstas son tipos por referencia&comma; lo que genera que una copia de una clase en otra provoque que ambas apunten a la misma dirección de memoria y por lo tanto&comma; al cambiar algo en una de ellas&comma; se modifique en la otra&period;<&sol;p>&NewLine;<h2>Estructuras en Swift – métodos<&sol;h2>&NewLine;<p>Como ya vimos en el capítulo anterior&comma; los métodos son funciones que podemos agregar a nuestras estructuras y forman parte del comportamiento que la misma posee&period; En pocas palabras&comma; definen lo que esa estructura es capaz de hacer&period;<&sol;p>&NewLine;<div class&equals;"nota"><strong>Nota<&sol;strong><br &sol;>&NewLine;Todas las reglas aplicadas a los funciones de una estructura son las mismas que vimos en el capitulo de funciones&comma; como las etiquetas de argumento&comma; los tipos de parámetros que existen&comma; el uso de self&comma; etcétera&period; Por lo tanto&comma; recomendamos releerlo en caso de ser necesario&period;<&sol;div>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<h3>Métodos de instancia comunes<&sol;h3>&NewLine;<p>Son los métodos más simples que vamos a encontrar en cualquier código Swift y se caracterizan por no modificar ningún elemento de la estructura&period; En general devuelven un resultado o realizan una impresión por consola&period;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Empleado &lbrace;<br &sol;>&NewLine;var nombre&colon;String<br &sol;>&NewLine;var edad&colon;Int<&sol;p>&NewLine;<p>func saludar&lpar;&rpar; &lbrace;<br &sol;>&NewLine;print&lpar;«Hola &bsol;&lpar;nombre&rpar;&excl;»&rpar;<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>steve&period;saludar&lpar;&rpar;<&sol;p>&NewLine;<p>&sol;&sol;Devuelve<br &sol;>&NewLine;&sol;&sol;Hola Bill&excl;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<h3>Métodos de instancia que modifican a la estructura<&sol;h3>&NewLine;<p>Como fue explicado párrafos atrás&comma; las estructuras son tipos por valor&period; Esto provoca que por defecto sus propiedades no puedan ser modificadas dentro de la estructura por sus propios métodos&period;<&sol;p>&NewLine;<p>Sin embargo&comma; en caso de necesitar modificar estos valores dentro de la estructura mediante alguno de sus métodos de instancia&comma; se debe marcar a la misma con la palabra reservada mutating&period;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Empleado &lbrace;<br &sol;>&NewLine;var nombre&colon;String<br &sol;>&NewLine;var edad&colon;Int<&sol;p>&NewLine;<p>func saludar&lpar;&rpar; &lbrace;<br &sol;>&NewLine;print&lpar;«Hola &bsol;&lpar;nombre&rpar;&excl;»&rpar;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>mutating func cambiarEdad&lpar;por nuevaEdad&colon;Int&rpar; &lbrace;<br &sol;>&NewLine;edad &equals; nuevaEdad<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>En el ejemplo anterior&comma; agregamos una función para poder cambiar la edad del empleado&period; Como la edad es una propiedad&comma; incluso si la misma está declarada como variable&comma; su modificación no es permitida por default y por lo tanto debemos usar la palabra mutating para modificar este comportamiento&period;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;steve&period;cambiarEdad&lpar;por&colon; 55&rpar;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<h4>Modificación de la estructura completa<&sol;h4>&NewLine;<p>Otra opción que nos permite Swift es la posibilidad de modificar completamente la estructura desde sus métodos de instancia usando la propiedad self&period; Lo que hace esta técnica es crear una nueva instancia y reemplazar a la ya existente&period;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Empleado &lbrace;<br &sol;>&NewLine;var nombre&colon;String<br &sol;>&NewLine;var edad&colon;Int<&sol;p>&NewLine;<p>func saludar&lpar;&rpar; &lbrace;<br &sol;>&NewLine;print&lpar;«Hola &bsol;&lpar;nombre&rpar;&excl;»&rpar;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>mutating func cambiarEdad&lpar;por nuevaEdad&colon;Int&rpar; &lbrace;<br &sol;>&NewLine;edad &equals; nuevaEdad<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>mutating func cambiarEmpleado&lpar;a nuevoEmpleado&colon;Empleado&rpar; &lbrace;<br &sol;>&NewLine;self &equals; nuevoEmpleado<br &sol;>&NewLine;&rcub;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>steve&period;cambiarEmpleado&lpar;a&colon; Empleado&lpar;nombre&colon; «Gabriel»&comma; edad&colon; 30&rpar;&rpar;<br &sol;>&NewLine;steve&period;saludar&lpar;&rpar;<&sol;p>&NewLine;<p>&sol;&sol;Devuelve&colon;<br &sol;>&NewLine;&sol;&sol;Hola Gabriel&excl;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Lo que sucede en ejemplo es que creamos una nueva función que recibe por parámetro a un Empleado &lpar;al estilo de las funciones recursivas que reciben un tipo de dato semejante a ellas&rpar; y mediante el uso de self modificamos completamente los valores de la estructura steve&period; Como estamos modificando su valor&comma; debemos forzosamente utilizar la palabra mutating&period;<&sol;p>&NewLine;<div class&equals;"infoAdicional"><strong>Información adicional<&sol;strong><br &sol;>&NewLine;Estos métodos se llaman de instancia porque solamente pueden ser usados una vez que se ha asignado el espacio en memoria correspondiente a la estructura&period; Su contrapartida son los métodos de tipo&period;<&sol;div>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<h3>Métodos de tipo<&sol;h3>&NewLine;<p>Este tipo de métodos&comma; a diferencia de los de instancia&comma; pueden ser invocados sin necesidad de crear una instancia de esa estructura&period; Por consiguiente&comma; los métodos de tipo son invocados usando el nombre del tipo justamente&period; Para indicar que se va a usar este tipo de métodos&comma; necesitamos incluir la palabra reservada static antes de func&period;<&sol;p>&NewLine;<p>Estos métodos no son propiedad exclusiva de las estructuras&comma; sino que también podemos usarlos en clases y enumeraciones&period;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;struct Mensajes &lbrace;<br &sol;>&NewLine;static let bienvenida &equals; «Bienvenido a la empresa»<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>struct Empleado &lbrace;<br &sol;>&NewLine;var nombre&colon;String<br &sol;>&NewLine;var edad&colon;Int<&sol;p>&NewLine;<p>func saludar&lpar;&rpar; &lbrace;<br &sol;>&NewLine;print&lpar;«Hola &bsol;&lpar;nombre&rpar;&excl;»&rpar;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>mutating func cambiarEdad&lpar;por nuevaEdad&colon;Int&rpar; &lbrace;<br &sol;>&NewLine;edad &equals; nuevaEdad<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>mutating func cambiarEmpleado&lpar;a nuevoEmpleado&colon;Empleado&rpar; &lbrace;<br &sol;>&NewLine;self &equals; nuevoEmpleado<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>func darBienvenida&lpar;&rpar; &lbrace;<br &sol;>&NewLine;print&lpar;«&bsol;&lpar;Mensajes&period;bienvenida&rpar; señor &bsol;&lpar;nombre&rpar;»&rpar;<br &sol;>&NewLine;&rcub;<&sol;p>&NewLine;<p>&rcub;<&sol;p>&NewLine;<p>steve&period;darBienvenida&lpar;&rpar;<&sol;p>&NewLine;<p>&sol;&sol;Devuelve<br &sol;>&NewLine;&sol;&sol;Bienvenido a la empresa señor Gabriel<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Como vemos&comma; creamos un struct que contiene un string estático&period; Luego&comma; en la estructura Empleado agregamos otra función para darle la bienvenida al empleado en cuestión y en ella hacemos uso de la estructura creada previamente pero sin instanciarlo&period; Directamente hacemos uso de su propiedad bienvenida sin haber hecho antes algo del estilo&colon;<&sol;p>&NewLine;<p>&lbrack;code lang&equals;»Swift»&rsqb;<br &sol;>&NewLine;let mensaje &equals; Mensajes&lpar;&rpar;<br &sol;>&NewLine;&lbrack;&sol;code&rsqb;<&sol;p>&NewLine;<p>Esto es posible porque&comma; como vimos&comma; los componentes marcados como static pertenecen al tipo &lpar;en este caso al tipo Mensajes&rpar; y NO a la instancia&period;<&sol;p>&NewLine;<p>Descarga el archivo <a href&equals;"https&colon;&sol;&sol;swiftlatino&period;com&sol;swiftlatino&sol;recursos&sol;Estructuras&percnt;20en&percnt;20Swift&period;playground&period;zip">playground<&sol;a>&period;<br &sol;>&NewLine;Siguiente capítulo&colon; <a href&equals;"https&colon;&sol;&sol;swiftlatino&period;com&sol;curso-swift-gratis&sol;enumeraciones-en-swift&sol;">Enumeraciones<&sol;a>&period;<&sol;p><div class&equals;"adsb30" style&equals;" margin&colon;12px&semi; margin-left&colon;0px&semi; text-align&colon;left"><div class&equals;"enlaceB30"> &NewLine;Si quieres aprender más sobre <a href&equals;"https&colon;&sol;&sol;swiftlatino&period;com&sol;ios&sol;" target&equals;&OpenCurlyDoubleQuote;&lowbar;blank”>que es iOS<&sol;a> sigue este enlace con una guía definitiva sobre el mejor Sistema Operativo para móviles&period; &NewLine;<&sol;div><&sol;div>&NewLine; <span id&equals;"state"><&sol;span> &Tab;&Tab;<form action&equals;"" method&equals;"post" enctype&equals;"multipart&sol;form-data" class&equals;"rr&lowbar;review&lowbar;form" id&equals;"fprr&lowbar;review&lowbar;form">&NewLine; <input type&equals;"hidden" id&equals;"&lowbar;wpnonce" name&equals;"&lowbar;wpnonce" value&equals;"0cefe88f20" &sol;><input type&equals;"hidden" name&equals;"&lowbar;wp&lowbar;http&lowbar;referer" value&equals;"&sol;curso-swift-gratis&sol;estructuras-swift-struct&sol;amp&sol;" &sol;>&Tab;&Tab;&Tab;<input type&equals;"hidden" name&equals;"rRating" id&equals;"rRating" value&equals;"0" &sol;>&NewLine;&Tab;&Tab;&Tab;<table class&equals;"form&lowbar;table">&NewLine;&Tab;&Tab;&Tab;&NewLine;&Tab;<tr class&equals;"rr&lowbar;form&lowbar;row">&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;heading rr&lowbar;required" >&NewLine;&Tab;&Tab;&Tab;Name&Tab;&Tab;<&sol;td>&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;input">&NewLine;&Tab;&Tab;&Tab;<span class&equals;"form-err"><&sol;span>&Tab;&Tab;&Tab;<input class&equals;"rr&lowbar;small&lowbar;input" type&equals;"text" name&equals;"rName" value&equals;"" &sol;>&NewLine;&Tab;&Tab;<&sol;td>&NewLine;&Tab;<&sol;tr>&NewLine;&Tab;<tr class&equals;"rr&lowbar;form&lowbar;row">&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;heading rr&lowbar;required" >&NewLine;&Tab;&Tab;&Tab;Email&Tab;&Tab;<&sol;td>&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;input">&NewLine;&Tab;&Tab;&Tab;<span class&equals;"form-err"><&sol;span>&Tab;&Tab;&Tab;<input class&equals;"rr&lowbar;small&lowbar;input" type&equals;"text" name&equals;"rEmail" value&equals;"" &sol;>&NewLine;&Tab;&Tab;<&sol;td>&NewLine;&Tab;<&sol;tr>&NewLine;&Tab;<tr class&equals;"rr&lowbar;form&lowbar;row">&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;heading rr&lowbar;required" >&NewLine;&Tab;&Tab;&Tab;Review Title&Tab;&Tab;<&sol;td>&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;input">&NewLine;&Tab;&Tab;&Tab;<span class&equals;"form-err"><&sol;span>&Tab;&Tab;&Tab;<input class&equals;"rr&lowbar;small&lowbar;input" type&equals;"text" name&equals;"rTitle" value&equals;"" &sol;>&NewLine;&Tab;&Tab;<&sol;td>&NewLine;&Tab;<&sol;tr>&NewLine;<tr class&equals;"rr&lowbar;form&lowbar;row">&NewLine;&Tab;<td class&equals;"rr&lowbar;form&lowbar;heading rr&lowbar;required">Rating<&sol;td>&NewLine;&Tab;<td class&equals;"rr&lowbar;form&lowbar;input">&NewLine;&Tab;&Tab;<span class&equals;"form-err"><&sol;span>&Tab;&Tab;<div class&equals;"rr&lowbar;stars&lowbar;container">&NewLine;&Tab;&Tab;&Tab;<span class&equals;"rr&lowbar;star glyphicon glyphicon-star-empty" id&equals;"rr&lowbar;star&lowbar;1"><&sol;span>&NewLine;&Tab;&Tab;&Tab;<span class&equals;"rr&lowbar;star glyphicon glyphicon-star-empty" id&equals;"rr&lowbar;star&lowbar;2"><&sol;span>&NewLine;&Tab;&Tab;&Tab;<span class&equals;"rr&lowbar;star glyphicon glyphicon-star-empty" id&equals;"rr&lowbar;star&lowbar;3"><&sol;span>&NewLine;&Tab;&Tab;&Tab;<span class&equals;"rr&lowbar;star glyphicon glyphicon-star-empty" id&equals;"rr&lowbar;star&lowbar;4"><&sol;span>&NewLine;&Tab;&Tab;&Tab;<span class&equals;"rr&lowbar;star glyphicon glyphicon-star-empty" id&equals;"rr&lowbar;star&lowbar;5"><&sol;span>&NewLine;&Tab;&Tab;<&sol;div>&NewLine;&Tab;<&sol;td>&NewLine;<&sol;tr>&Tab;<tr class&equals;"rr&lowbar;form&lowbar;row">&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;heading rr&lowbar;required">&NewLine;&Tab;&Tab;&Tab;Review Content&Tab;&Tab;<&sol;td>&NewLine;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;input">&NewLine;&Tab;&Tab;&Tab;<span class&equals;"form-err"><&sol;span>&Tab;&Tab;&Tab;<textarea class&equals;"rr&lowbar;large&lowbar;input" name&equals;"rText" rows&equals;"10"><&sol;textarea>&NewLine;&Tab;&Tab;<&sol;td>&NewLine;&Tab;<&sol;tr> <tr class&equals;"rr&lowbar;form&lowbar;row rr-honeydo">&NewLine; <td>&NewLine; <label class&equals;"rr-honeydo" for&equals;"org"><&sol;label>&NewLine; <&sol;td>&NewLine; <td>&NewLine; <input class&equals;"rr-honeydo" autocomplete&equals;"off" type&equals;"text" id&equals;"org" name&equals;"org" placeholder&equals;"Your Organization">&NewLine; <&sol;td>&NewLine; <&sol;tr>&NewLine;&Tab;&Tab;&Tab;&Tab;<tr class&equals;"rr&lowbar;form&lowbar;row">&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;<td><&sol;td>&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;<td class&equals;"rr&lowbar;form&lowbar;input"><input id&equals;"submitReview" name&equals;"submitButton" type&equals;"submit" value&equals;"Submit"&sol;><&sol;td>&NewLine;&Tab;&Tab;&Tab;&Tab;<&sol;tr>&NewLine;&Tab;&Tab;&Tab;<&sol;table>&NewLine;&Tab;&Tab;<&sol;form>&NewLine;&Tab;&NewLine;&Tab;&Tab;<div itemscope itemtype&equals;"http&colon;&sol;&sol;schema&period;org&sol;Organization">&NewLine;&Tab;&Tab;&Tab;<span itemprop&equals;"name" style&equals;"display&colon;none">&NewLine;&Tab;&Tab;&Tab;&Tab;Estructuras en Swift&Tab;&Tab;&Tab;<&sol;span>&NewLine;&Tab;&Tab;&Tab;<div class&equals;"star-rating"><span class&equals;"screen-reader-text">5&comma;0 rating based on 12&period;345 ratings<&sol;span><div class&equals;"star star-full" aria-hidden&equals;"true"><&sol;div><div class&equals;"star star-full" aria-hidden&equals;"true"><&sol;div><div class&equals;"star star-full" aria-hidden&equals;"true"><&sol;div><div class&equals;"star star-full" aria-hidden&equals;"true"><&sol;div><div class&equals;"star star-full" aria-hidden&equals;"true"><&sol;div><&sol;div>&Tab;&Tab; Overall rating&colon;&Tab;&Tab;&Tab;<span itemprop&equals;"aggregateRating" itemscope itemtype&equals;"http&colon;&sol;&sol;schema&period;org&sol;AggregateRating">&NewLine;&Tab;&Tab;&Tab;&Tab;<strong>&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;<span class&equals;"value" itemprop&equals;"ratingValue">5<&sol;span>&NewLine;&Tab;&Tab;&Tab;&Tab;<&sol;strong> out of&Tab;&Tab;&Tab;&Tab;<strong><span itemprop&equals;"bestRating">5<&sol;span><&sol;strong> based on&Tab;&Tab;&Tab;&Tab;<span class&equals;"votes" itemprop&equals;"reviewCount">&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;4&Tab;&Tab;&Tab;&Tab;<&sol;span> reviews&period;&Tab;&Tab;&Tab;<&sol;span>&NewLine;&Tab;&Tab;&Tab;<div itemprop&equals;"review" itemscope itemtype&equals;"http&colon;&sol;&sol;schema&period;org&sol;Review">&NewLine;&Tab;&Tab;&Tab;&Tab;<span itemprop&equals;"author" itemscope itemtype&equals;"https&colon;&sol;&sol;schema&period;org&sol;Person" style&equals;"display&colon; none&semi;">&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;<span itemprop&equals;"name">Anonymous<&sol;span>&NewLine;&Tab;&Tab;&Tab;&Tab;<&sol;span>&NewLine;&Tab;&Tab;&Tab;<&sol;div>&NewLine;&Tab;&Tab;<&sol;div>&NewLine;&Tab;&NewLine; <style> ins&period;adsbygoogle &lbrace; background&colon; transparent &excl;important&semi; &rcub; <&sol;style><div class&equals;"hatom-extra" style&equals;"display&colon;none&semi;visibility&colon;hidden&semi;"><span class&equals;"entry-title">Estructuras en Swift<&sol;span> was last modified&colon; <span class&equals;"updated"> abril 29th&comma; 2019<&sol;span> by <span class&equals;"author vcard"><span class&equals;"fn">Gabriel<&sol;span><&sol;span><&sol;div>

Salir de la versión móvil