"Continuamos nuestro curso sobre el desarrollo de aplicaciones para el dispositivo de Apple, con el que terminaremos de programar un puzzle de 3x3.

Objective-C. Un lenguaje orientado a objetos “diferente”

Objective-C es el lenguaje nativo para programar aplicaciones tanto para Mac OS X como para iPhone. Es una extensión más de ANSI C, y como casi cualquier otro lenguaje orientado a objetos (OO), tiene clases, métodos, propiedades, encapsulación, herencia, polimorfismo... Otros lenguajes con soporte de orientados a objetos, como Java, C++, C#, o PHP, tienen una sintaxis parecida entre ellos, de modo que un programador de cualquiera de esos lenguajes puede leer y entender con relativa facilidad un código escrito en otro. Sin embargo Objective-C, basado en la sintaxis de Smaltalk, tiene poco que ver con ellos.

Para que esto no suponga un gran obstáculo, vamos a intentar enumerar unos cuantos consejos y equivalencias que facilitarán las cosas al lector relacionado con otros lenguajes OO. Al menos cubriremos todas las cosas “nuevas” que utilizaremos para desarrollar la aplicación de ejemplo.

Clases

Al igual que en C++, normalmente las clases en Objective-C se separan en dos ficheros, un .h y un .m. El .h contendrá la declaración de la clase y el .m contendrá la implementación.

Para los programadores de Java, la palabra clave interface puede resultar engañosa. @interface en Objective-C es una palabra reservada para la declaración de una clase. El equivalente a las interfaces de Java en Objective-C son los protocols.

La herencia se representa con el símbolo “:” Así, si la clase A extiende a la clase B, la sintaxis en Objective-C sería @interface A : B

Las declaraciones de las clases incluyen los variables miembros de esa clase y los prototipos de los métodos que serán implementados.

La diferencia principal con los otros lenguajes citados viene a la hora de declarar y usar los métodos. La sintaxis permite leer de una forma natural qué es lo que el método hace, de forma que el método esta identificado no sólo por un nombre como en otros lenguajes, sino por una serie de palabras clave que forman una frase descriptiva de la acción que realiza el método. Supongamos un método que desliza una imagen hasta un punto. Su declaración sería:

- (void)slideImage:(UIView *)image to:(UITouch *)touch;

donde UIView/UITouch son tipos de datos que veremos más adelante, en el ejemplo.

Cuidado con el signo – en la declaración. Este podría ser un signo – o un signo +, y es otra de las cosas que más confusión pueden causar, sobre todo si estamos familiarizados con UML. En este caso, los signos no tienen nada que ver con la visibilidad de los métodos (public, protected, private), sino que indican si estos son referentes a la clase o a la instancia del objeto creado. La equivalencia de un signo + es un método static en Java o C++.

La implementación de una clase en Objective-C se identifica con la palabra clave @implementation seguida del nombre de la clase, que debe coincidir con el de la declaración.

Llamadas a métodos

Para llamar a métodos en Objective-C se envían “mensajes” al objeto correspondiente. El mensaje esta formado por las palabras clave que identifican el método y por los parámetros que recibe. Los mensajes se encierran entre corchetes “[]”, donde lo primero que aparece a la izquierda es el objeto que recibe el mensaje, seguido del mensaje en sí y los parámetros que este requiera. Por ejemplo, insertar un objeto X en la posición Y del array miArray tendría la siguiente sintaxis:

[miArray insertObject:X atIndex:Y];

Esta sintaxis permite anidar corchetes para evitar crear variables locales si los objetos que reciben los mensajes o los parámetros a utilizar provienen de llamadas a otros métodos.

Propiedades

La idea de las properties es evitar que tengamos que escribir “getters” y “setters” para todos los atributos de las clases. Se declaran con la palabra reservada @property y definen el comportamiento de los métodos para acceder a la variable (cosas como “sólo lectura”, etcétera), así como el tipo y por supuesto el nombre de la variable.

Arrays

Dos cosas importantes a saber que seguro ahorrarán mucho tiempo a los primerizos en Objective-C. La primera es que la mayoría de los tipos que los diferentes frameworks proporcionan que podrían identificarse como arrays, como por ejemplo NSArray, son en realidad arrays inmutables, esto es, una vez inicializados no se pueden modificar. Para obtener el comportamiento de un array como estamos acostumbrados a hacerlo en otros lenguajes hemos de usar tipos como NSMutableArray.

El segundo detalle a tener en cuenta es que a la hora de inicializar un array, se utiliza la palabra reservada nil para indicar el fin del array. Esto significa que no podemos utilizar nil para indicar que queremos inicializar alguno de los elementos del array a nulo. Para ello utilizaremos el tipo NSNull. Así, un array inicializado con cuatro elementos, el cuarto de ellos nulo, quedaría:

miArray = [NSMutableArray arrayWithObjects:obj1, obj2, obj3, [NSNull null], nil];

Creación de la interfaz gráfica

Normalmente Interface Builder arrancará con cuatro ventanas abiertas. Una de ellas, en nuestro caso titulada “Window”, y que debe aparecer como una ventana en blanco, representa nuestra aplicación. La ventana titulada MainWindow.xib nos permite acceder a cosas como las conexiones de nuestra interfaz con las clases en nuestro código. En este momento, en esta ventana deberían aparecer unos cubos llamados “File´s Owner”, “First Responder”, a los que de momento no haremos mucho caso, otro cubo representando al anteriormente descrito “Application Delegate”, y la instancia de la ventana que de momento forma nuestra aplicación.

Una tercera ventana nos da acceso a las propiedades de los objetos que tengamos seleccionados, ya sean aspectos visuales o conexiones entre objetos. Nos referiremos a esta ventana como el “Inspector”. Consta de cuatro pestañas, “attributes”, “connections”, “size” e “identiy”.

La cuarta y última ventana, titulada “Library”, muestra la biblioteca de objetos que podemos utilizar para crear nuestra interfaz.

Si alguna de estas ventanas no apareciera puede ser abierta desde el menú “Tools”.

Es importante mencionar que en iPhone sólo una aplicación puede ser ejecutada en cada momento. Sólo unas pocas aplicaciones nativas a bajo nivel están pendientes de si entran llamadas y cosas similares. Igualmente importante es saber que las aplicaciones están formadas por una sola ventana, que a su vez puede contener varias vistas (“View”).

Interface Builder nos permite fácilmente configurar nuestra interfaz mediante sencillos controles gráficos, menús y diálogos. Empecemos por cambiar el color de fondo a nuestra aplicación. Todavía no hemos añadido ningún elemento a la ventana principal, así que la seleccionamos pinchando en cualquier parte de la ventana titulada “Window”. En la primera pestaña del Inspector, “Window Attributes”, podemos cambiar el color de fondo de la ventana que tenemos seleccionada mediante un sencillo selector de color similar al de cualquier programa de manipulación de imágenes.

Para representar el tablero del