En esta segunda entrega del curso Desarrollo de Apps para iOS vamos a ver una pequeña introducción a Objetive-C, que Apple utiliza como lenguaje de programación para la construcción de sus aplicaciones. Para ello, vamos a crear la clase de ejemplo NaveEspacial.
Vamos a seguir paso a paso su implementación, destacando todo lo más importante que llegados a este punto del curso debemos conocer. Si has programado alguna vez en Java, C, C++ o C#, no creo que tengas excesivo problema en comprender su sintaxis y su semántica. En la tercera entrega del curso, veremos las herramientas para crear nuestra primera aplicación para el iPhone. El nuevo lenguaje de programación que vamos a aprender, Objetive-C, es un superconjunto estricto del lenguaje C (cuyo creador nos abandonó hace muy poco) que agrega sintaxis para clases, métodos, etc. Existen algunos elementos como las propiedades o el enlace dinámico que lo diferencian de C.
Objetive-C: Comencemos
Por lo general, en Objetive-C, los objetos no tienen acceso a las variables de instancia directamente. Para dicho acceso, usamos las propiedades (si has trabajado con Visual Basic .NET, el concepto de propiedad es el mismo). Este es uno de los conceptos más importantes que deberás de entender en este artículo. Una propiedad es simplemente la combinación de un método getter, para obtener el valor de una variable de instancia, y un método setter, para establecer o almacenar un valor en dicha variable de instancia de un objeto. El método getter tiene el nombre de la propiedad (por ejemplo, miValor) y el nombre del método setter se establece capitalizando el nombre de la propiedad (por ejemplo, setMiValor:) Para hacerlo sencillo, nunca usaremos directamente la variable de instancia, siempre invocaremos al método setter para almacenar el valor que nosotros queremos en ella y al método getter para obtenerlo. Así de simple, más adelante en este artículo, veremos cómo implementar una propiedad en Objetive-C.
Pasemos ahora a hablar del lenguaje Objetive-C. Para que nos sea mas sencillo, vamos a usar una clase de ejemplo denominada NaveEspacial. Esta clase, va a estar integrada en una jerarquía de clases, que nos ayudarán a introducirnos poco a poco en el diseño para iOS. Esa jerarquía la podemos ver en el siguiente diagrama de clases de la figura 1.

Antes de empezar a crear la estructura de la clase, lo primero que nos ha de quedar claro es que todas las clases en Objetive-C están compuestas de dos ficheros: Uno que contendrá la interfaz con la declaración de los métodos públicos (extensión .h) y el otro fichero albergará la implementación, tanto de los métodos públicos como de los métodos privados de la clase (extensión .m). La figura 2 muestra una primera aproximación de nuestra NaveEspacial. Como curiosidad, fijémonos en cómo se declaran los métodos privados en el fichero NaveEspacial.m (puedes hacer click para ampliar las imágenes del artículo).

Una vez analizada la estructura de una clase, nos detendremos ahora para ver cómo declarar e implementar un método de la misma. Vamos a poner nuestra NaveEspacial en órbita alrededor de un determinado Planeta, situándola a una determinada altura (en km) del mismo. Para ello, implementamos el método que podemos observar en la figura 3. A destacar, la forma en la que se nombra al método orbitaPlaneta:enAltitud: que difiere de cómo se hace en otros lenguajes.

Bien, ahora que ya sabemos cómo declarar e implementar clases y métodos, veamos la forma de hacerlo con las propiedades. Imaginemos que necesitamos saber/establecer la velocidad máxima a la que puede circular nuestra NaveEspacial por la bóveda celeste. Para ello usaremos una propiedad que nos permitirá hacer las validaciones necesarias antes de manipular la correspondiente variable de instancia (sobre todo al establecer su valor). La figura 4 muestra la forma de llevar a cabo esta implementación.

Al usar @synthesize no sería necesario implementar los métodos getter y setter en el fichero de implementación. Sin embargo, si se quiere hacer alguna validación, si haría falta hacerlo. Por ejemplo, imaginemos que antes de establecer la velocidad máxima de nuestra NaveEspacial, queremos comprobar que esta velocidad, se encuentra dentro de un determinado rango. En este caso, solamente es necesario implementar el método setter, tal y como se muestra en la figura 5, comprobando que la velocidad esta entre los valores 0 y 1 antes de asignarle el valor a la variable _velocidadMaxima.

Como podemos observar en la figura 5, aparte de implementar el método setter, hemos añadido una propiedad privada, que nos indicará el próximo AgujeroGusano que nos encontremos en nuestro camino por el espacio. Para innovar, hemos hecho que esta vez sea un puntero a un objeto (en lugar de un dato primitivo), por lo que es importante que leamos los comentarios de la imagen, sobre todo para ver cómo se va a manejar este puntero. En publicaciones futuras veremos, con más profundidad, la manera de asignar e inicializar los punteros con Objetive-C.
Ahora echemos un vistazo a algunos ejemplos de código, esto lo haremos sólo para tener una temprana idea de la sintaxis de Objective-C. Para ello, vamos a implementar de manera sencilla nuestro método orbitaPlaneta:enAltitud:Esta implementación se muestra en la figura 6.

Si observamos la figura 6, uno de los temas más importantes es el paso de mensajes a objetos (lo que tradicionalmente denominamos invocación de métodos o acceso a propiedades). Objetive-C soporta dos notaciones distintas, la notación clásica o punto y la notación de corchetes y también hemos de decir que se pueden usar indistintamente una u otra, incluso mezcladas. Bueno, pues como introducción al lenguaje creo que es suficiente, no olvides repasar lo visto en el capítulo anterior del curso acerca del MVC.
En próximas entradas profundizaremos mucho más en el lenguaje Objetive-C para construir estructuras mas complejas. Espero que te haya resultado interesante y por supuesto, si tienes alguna duda, déjame tu comentario, que te la resolveré con mucho gusto.
Adios, os!