Creación App’s #08 iOS – Características avanzadas del lenguaje Swift

1. Tipos Para Colecciones De Datos

En múltiples ocasiones dentro de una aplicación, necesitamos almacenar mucha información de un mismo tipo, como por ejemplo, todos los precios de una tienda o todas las notas de una clase. Para ello existen distintos tipos de datos colectivos como los arrays o los diccionarios

1.1. Arrays En Swift

Para almacenar ésta información están los vectores, llamados arrays. Un array permite almacenar información de muchos elementos en un solo objeto (normalmente del mismo tipo), pudiendo acceder a dichos elementos mediante un índice.

Normalmente cuando contamos elementos empezamos a contar por el número uno, pero en un array la primera posición es la 0.

Características avanzadas del lenguaje Swift

En Swift, un array solo puede contener elementos del mismo tipo. Recuerda que las variables declaradas con let no pueden modificarse (son inmutables). Con los arrays pasa lo mismo, por lo que si se intentan añadir datos al array después de haberlo creado, dará un error. Por tanto, hay que declararlos con var si se van a modificar.

Podemos crear un array de la siguiente forma:

Características avanzadas del lenguaje Swift

Un array es un objeto de una clase (veremos esto más adelante). Por lo tanto, tiene métodos (funciones) asociadas a ese objeto. Estos métodos cubren la mayoría de las necesidades de esta estructura de datos: inserción, modificación, borrado, ordenación…

1.2. Diccionarios En Swift

Los diccionarios son conjuntos de tuplas, las cuales son pares de datos asociados. Por tanto, un diccionario es un conjunto de pares asociados: una clave (que ha de ser única) y un valor (que puede estar repetido).

Su nombre es muy descriptivo. Pensemos en un diccionario: para buscar una definición, acudimos a su palabra (índice). La definición puede ser la misma que otra palabra, pues existen muchos sinónimos en la lengua, pero no hay dos índices iguales con distinta definición. Dentro de un mismo índice puede haber varias definiciones posibles.

Su creación en Swift se hace de la siguiente forma:

Características avanzadas del lenguaje Swift

Aquí podemos ver un ejemplo de todo lo comentado:

Características avanzadas del lenguaje Swift

2. Introducción A La PDOO

Hoy en día el paradigma de orientación a objetos es el más utilizado para programar y prácticamente lo podemos encontrar en la mayoría de los lenguajes de programación más utilizados, como Java, PHP, C++, Objective-C, Swift, etc.

Pero, ¿qué es realmente la orientación a objetos? La orientación a objetos es una forma de programar que rompe con la forma de programar clásica.

En un entorno clásico de programación el problema o sistema que se está analizando se divide en funciones: este sistema hace esto, esto y esto.

Para llevar a cabo el análisis con la programación orientada a objetos hay que tener en cuenta que los programas se codifican pensando en objetos que interactúan.

Los objetos tendrán unas determinadas propiedades y serán capaces de hacer ciertas cosas mediante los métodos que se les hayan definido.

Si se hace un buen diseño de los objetos y de las clases, se podrán usar en nuevos programas y proyectos fácilmente, favoreciendo la reusabilidad.

2.1. Clases Y Objetos

En la programación orientada a objetos, el sistema se divide en objetos o entidades que podemos encontrar en la realidad. Una clase es la agrupación de estos objetos.

Veamos un ejemplo. Imagine que está realizando la simulación de un coche.

Realizando una descomposición funcional del coche (programación funcional clásica), podría hablar de:

  • Arrancar y apagar.
  • Girar a la izquierda y a la derecha.
  • Cambiar de marcha.
  • Moverse hacia delante.
  • Moverse hacia atrás.
  • Aumentar la velocidad.
  • Disminuir la velocidad.

Si pensara en objetos, hablaríamos de partes del coche, por ejemplo, un motor que se puede arrancar y apagar utilizando para ello el contacto.

Además, el coche dispone de un volante que permite que nos desplacemos en una determinada dirección: derecha o izquierda. Al aumentar la velocidad utilizando el acelerador, debemos cambiar a una marcha más alta. Si reducimos la velocidad con el freno, puede que sea conveniente cambiar a una marcha inferior…

Observe cómo en la descomposición funcional nos hemos fijado en lo que debería hacer el coche, mientras que en la descomposición en objetos nos hemos centrado en qué elementos podemos encontrar: motor, volante, acelerador, freno, caja de cambios, etc.

Al pensar en objetos en lugar de en funciones, nos acercamos más a la realidad, ya que es la forma en que lo haríamos en una situación cotidiana.

De esta forma, una vez encontrados los objetos que intervienen, podremos asignarles las tareas que tienen que realizar.

2.1. Creando Nuestra Primera Clase En Swift

Ahora vamos a crear nuestra primera clase, por seguir con el ejemplo, haremos la clase Coche:

Características avanzadas del lenguaje Swift

Como vemos, nuestra clase tiene 4 atributos y un método conducir, que muestra en pantalla que el coche está siendo conducido. Una vez creada nuestra clase, podremos crear los “objetos coche” que queramos. Por ejemplo, vamos a crear un array de coches y a conducirlos:

Características avanzadas del lenguaje Swift

La salida es

Características avanzadas del lenguaje Swift

3. Búsqueda De Clases Y Métodos En Swift

Hace poco explicábamos la utilidad de las funciones: encapsular las operaciones que se realizan con asiduidad. No tiene sentido reinventar la rueda, y por eso, Apple nos proporciona junto con Xcode muchas librerías para hacer tareas estipuladas.

Una librería es un conjunto de funciones empaquetadas con el mismo nombre. Por ejemplo, una librería podría ser matemáticas, y dentro de ella estarían las funciones de suma, resta, multiplicación, etc.

El conjunto de librerías que Apple proporciona para el lenguaje Swift son las mismas que las de Objective-C. Esto tiene una parte buena: podremos consultar la documentación de Objective-C para ciertas tareas. La parte mala es que las funciones, aunque se llamen igual, no siempre realizan las tareas de la misma forma.

De momento hay poca documentación para Swift, por lo que se recomienda aprender un poco de Objective-C, ya que para hacer cosas más concretas de nuestra aplicación quizá necesitemos usar este lenguaje.

3.1. Buscando Métodos

xisten métodos que nos proporciona Xcode con los cuales podemos tener multiples funcionalidades, es decir, antes de escribir código propio o tratar de programar la solución a un problema es recomendable conocer los métodos que nos facilita Xcode.

Para ver los métodos que podemos usar con un objeto concreto, escribiremos el nombre de nuestro objeto seguido de un punto, y veremos un desplegable con los métodos disponibles. Si no se muestra este desplegable, pulsa la tecla “escape”. Por ejemplo, para los arrays y diccionarios, respectivamente, podemos ver:

Características avanzadas del lenguaje Swift

Características avanzadas del lenguaje Swift

En la parte de abajo podemos leer una descripción sobre lo que realiza el método. Como se ha comentado, la mayoría de estos métodos del framework Cocoa provienen de clases de Objective-C. De hecho, Swift usa internamente muchas de estas funciones, evitando que las tengamos que escribir nosotros.

3.2. Clases Y Objetos En Interface Builder

Ahora vamos a dejar el entorno de pruebas que estamos usando (playground) y vamos a pasar al proyecto de HolaMundoque desarrollamos al inicio del curso.

Nos vamos a la parte de la izquierda donde están los archivos del proyecto y seleccionamos el archivo Main.storyboard para que se abra el Interface Builder.

Cuando seleccionamos un objeto de Lybrary (un componente gráfico) nos aparece el nombre del objeto y la clase a la que pertenece. Por ejemplo, si seleccionamos el objeto botón, leerás «UIButton«. Así ocurre para todos objetos de Interface Builder.

Características avanzadas del lenguaje Swift

Una vez sabemos el nombre de la clase a la que pertenece cada componente, podemos buscar cómo usarlo en API o por Internet.

Por ejemplo, la referencia completa de la librería UIKit usada para el desarrollo en iOS (véase al inicio del archivo ViewController.swift cómo importa la librería UIKit) puede consultarse en https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKit_Framework/

3.3. Interoperabilidad

Con el nuevo lenguaje de Apple, es posible usar las clases de Cocoa y Objective-C desde Swift y viceversa. Por ejemplo, se puede usar una librería de Objective-C en Swift, y una de Swift en Objetive-C (también se puede hacer con otros lenguajes como C).

Existen varias formas de hacer trabajar ambos lenguajes, y lo veremos en ejemplos más avanzados.

3.4. Kits

Los desarrolladores la Apple nos facilitan el trabajo para el desarrollo de aplicaciones. Una de las partes más costosas la del desarrollo de la interfaz gráfica de usuario.

Dibujar ventanas y sus elementos nunca fue tan fácil con la ayuda de los dos principales entornos de trabajo, el Foundation Kit y el Application Kit. Estos conjuntos de clases provienen de Objective-C, así que se vuelve a aconsejar al lector que lea un poco sobre el lenguaje y sobre la jerarquía de clases de NSObject.

Estos dos entornos de trabajo están bien documentados en la ayuda de XCode, así que se anima al lector a leer la documentación al respecto.

4. Gestión De Memoria

Gran parte de los lenguajes de programación permiten la reserva de memoria en tiempo de ejecución. El tiempo de ejecución se refiere al momento durante el cual el programa se está ejecutando. El proceso de reserva de memoria varía según la sintaxis del lenguaje, pero siempre involucra el retorno de un puntero (unidentificador de una dirección de memoria) al inicio del bloque de memoria reservado. Una vez la memoria reservada deja de necesitarse (el puntero que la referencia esta «out of scope»), el programa o el entorno de ejecución debería liberar esa memoria. En C, C++, y otros lenguajes, el programador es responsable de la gestión de la liberación de memoria. Esta es una tarea complicada a veces porque no siempre se sabe a priori cuándo se puede liberar la memoria. Los programas que no liberan la memoria utilizada pueden generar errores de ejecución cuando ya no queda memoria disponible en el sistema. Se dice que estos programas tienen fugas de memoria («memory-leaks»).

4.1. Automatic Referente Counting En Swift

Swift, al igual que Objective-C, libera al programador de la responsabilidad de liberar la memoria. El «Garbage collector» está anticuado, y ahora se denomina ARC: Automatic Referente Counting. Mediante este proceso se libera la memoria de forma automática durante el ciclo de vida del programa. El ARC funciona con todos los objetos que heredan de NSObject (todos los que vamos a usar lo hacen), por lo tanto debemos de olvidarnos de métodos para liberar memoria.

Lo más importante. Recuerda

  • Un array permite almacenar información de muchos elementos en un solo objeto (normalmente del mismo tipo), pudiendo acceder a dichos elementos mediante un índice.
  • Normalmente cuando contamos elementos empezamos a contar por el número uno, pero en un array la primera posición es la 0.
  • Un diccionario es un conjunto de pares asociados: una clave (que ha de ser única) y un valor (que puede estar repetido).
  • En la programación orientada a objetos, el sistema se divide en objetos o entidades que podemos encontrar en la realidad. Una clase es la agrupación de estos objetos.
  • Para ver los métodos que podemos usar con un objeto concreto, escribiremos el nombre de nuestro objeto seguido de un punto, y veremos un desplegable con los métodos disponibles.
  • Con el nuevo lenguaje de Apple, es posible usar las clases de Cocoa y Objective-C desde Swift y viceversa.