Saltar al contenido
KodigoSwift

Tutorial Swift – Estructuras y Clases

Estructuras y Clases

Hoy vamos a aprender acerca de las estructuras y las clases, ambas pilares sobre los que construimos nuestras aplicaciones. Esta es un área que comparte Swift con otro lenguajes de programación pero con sus particularidades propias, esas que lo definen como único.

Este Tutorial Swift no será muy extenso ya que las clases y las estructuras son muy parecidas, de hecho sus métodos se comportan de manera similar a las funciones, tema que ya hemos discutido en artículos anteriores, por esto no explicaremos temas tan básicos como que cosa es un parámetro o un valor de retorno. Veremos las características más notables y constataremos como ambas nos brindan mecanismos que nos permitirán modelar todo cuanto queramos representar en nuestro código.

Definición de Sintaxis

Las estructuras y las clases cuentan con una definición de sintaxis muy similar. La declaración de las clases la iniciamos con la palabra clave class y las estructuras con struct, ambas establecen su definición dentro de las llaves:

Estructuras

Una estructura es un tipo que agrupa en la memoria Stack un set de datos relacionados llamados propiedades y métodos que nos permitirán añadir funcionalidades. Veamos un ejemplo:

…en el ejemplo anterior he optado por mostrar un escenario donde entran en juego algunas características de las estructuras.

En la línea 3 tenemos una propiedad de las cuales ya hemos hablado en otro artículos, de la línea 5 a la 9 tenemos nuestro init o inicializador , lo que en otros lenguajes vendría siendo el constructor y que en el caso de Swift no es obligatorio ya que el compilador genera uno por nosotros que inicializa todas las propiedades. Pero en este ejemplo lo he declarado de manera explícita dado que necesito que la inicialización de la propiedad de la línea 3 sea de la manera que yo quiero, en este caso en la línea 7 la igualamos al contenido pasado como argumento pero en mayúsculas. Luego de las líneas 11 a la 15 tenemos el método cambiarPropiedad el cual hace honor a su nombre como debe de ser y su único objetivo es cambiar o mutar el valor almacenado por nuestra única propiedad.

En este punto notamos que nuestro método comienza por la palabra clave mutating la cual viene a informar al compilador que dentro de este método se modifican los valores de una propiedad. La salida en pantalla sería:

Clases

Una clase es también un tipo que agrupa en la memoria Heap un set de datos relacionados igualmente llamados propiedades y métodos que nos permitirán añadir funcionalidades. Veamos un ejemplo:

…el ejemplo anterior contiene los siguientes errores:

…no compila ya que a diferencia de las estructuras las clases cuando no damos un valor por defecto a las propiedades el compilador no crea un método init que inicialice las propiedades por nosotros, tenemos que definirlo de manera explícita. Así que las soluciones pudieran ser dos, o bien damos un valor por defecto:

…o declaramos el método init, quedando así:

Como se puede observar con la excepción de la palabra clave mutating este ejemplo es prácticamente similar al anterior de la estructura.

¿Diferencias?

En este punto quizás nos surja una pregunta: ¿Dónde residen las grandes diferencias entre ambos tipos? …si pues las características antes comentadas realmente no significan tanto como para que justifique la existencia de estos bloques, ya que si esto fuera todo pues con uno sería más que suficiente ¿no lo creen así?

Comparando Estructuras y Clases

Las estructuras y las clases tienen mucho en común como hemos visto hasta este punto. Pudiéramos resumir en que ambos pueden:

  • Definir propiedades para almacenar valores
  • Definir método para proporcionar funcionalidades
  • Definir subscripts en pos de permitir el acceso a sus valores mediante la sintaxis subscripts
  • Definir inicializadores para establecer su estado inicial
  • Pueden ser extendidas sus funcionalidades más allá de la implementación por defecto
  • Pueden ajustarse a protocolos en pos de proveer funcionalidades estándar de algún tipo

…pero en el caso de las clases estas cuentan con características únicas, la siguientes:

  • Herencia, permitiendo a una clase heredar las características de otra
  • Casting de tipo, permitiendo verificar e interpretar el tipo de una instancia en tiempo de ejecución
  • De-Inicializadores, similar a los destructores en C++ y que nos permite liberar recursos asignados
  • Conteo de referencias, permite más de una referencia apuntando a una misma instancia

Luego de ver las similitudes y diferencias podemos concluir en que la diferencia principal radica en que las estructuras son tipos por valor y las clases por referencia, esto básicamente significa que cuando copiamos una estructura el destino obtiene una copia nueva de la misma mientras que cuando se trata de una clase lo que enviamos es una referencia a la instancia.

Esto en otros lenguajes muchas veces tiene grandes inconvenientes ya que en ocaciones no es deseable una copia nueva de los mismos datos ni tampoco una referencia que modifique otras áreas del código, en paralelo con el consumo que puede significar tener datos dobles en memoria o el tiempo de asignación en el Heap que usualmente es más lento en el Stack.

Evidentemente son cuestiones  muy ligadas al diseño aunque en Swift al copiar las estructuras no siempre se duplican los datos y esto es gracias a la característica Copy on Write de la cual hablaremos en un próximo artículo que dedicaremos exclusivamente a los tipos por valor y por referencia.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo mediante el formulario en el panel derecho y síguenos en nuestras redes sociales. Mantente así al tanto de todas nuestras publicaciones futuras.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

Cualquier sugerencia, ya sea errores a corregir, información o ejemplos a añadir será, más que bienvenida, necesaria!

Entradas relacionadas

RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!