#import <Foundation/Foundation.h>
int main () {
int i, n, t, v;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *a = [NSMutableArray arrayWithObjects: nil];
NSNumber *it;
NSMutableString *out = [NSMutableString alloc];
NSLog (@"Introduce dos números separados por espacios ? : ");
n = scanf ("%d %d", &n, &t);
NSLog (@"Introduce 10 números separados por espacios ? : ");
for (i = 0; i < 10; i++)
{
n = scanf ("%d", &v);
[a addObject: [NSNumber numberWithInt: v]];
}
for (it in a) printf ("%d:", [it intValue]);
printf ("\n");
for (i = 0; i < [a count]; i++)
printf ("%d#", [[a objectAtIndex: i] intValue]);
printf ("\n");
for (it in a)
[out appendString: [NSString stringWithFormat:@"%@ ",
[it stringValue]]];
NSLog (@"%@", out);
[pool drain];
return 0;
}Como siempre, la versión C es perfectamente compatible con
Objective-C, pero aquí vamos a aprovechar para introducir algunas
capacidades de este lenguaje. Para mantener el código sencillo y la
exposición al lenguaje progresiva, vamos a utilizar la función C
estándar scanf para leer los datos del usuario, pero tanto
el array como las conversiones las haremos utilizando las capacidades de
la librería estándar NS.
Todo lo que hemos comentado sobre el uso de
scanfen C sigue aplicando cuando usamos Objective-C, pero no lo vamos a volver a repetir aquí. Echadle un ojo a la entrada sobre lenguaje C.
Para declarar nuestro vector vacío, crearemos un objeto de la clase
NSMutableArray, esto es necesario puesto que queremos
modificar los elementos del array. Como consecuencia de utilizar esta
clase para nuestro vector, debemos almacenar objetos estándar en él.
Esto significa que debemos convertir los valores enteros que leemos con
scanf en objetos de tipo NSNumber. Esto lo
hacemos con la siguiente instrucción:
[NSNumber numberWithInt: v];Una vez convertido lo podemos añadir al array, enviando el mensaje
addObject al objeto array pasando como parámetro el objeto
NSNumber recién creado.
[a addObject: [NSNumber numberWithInt: v]];La línea anterior realiza todo en una paso. Crea un objeto
NSNumber inicializado con el valor int
v, y lo añade al array a. Observad que el
array a contiene objetos que pueden ser de cualquier
tipo
Si en lugar de un número quisiéramos leer una cadena de caracteres tendríamos que utilizar un código como el siguiente:
fgets (buf, sizeof(buf), stdin); NSString *str = [NSString stringWithCString: buf];
numberWithIntostringWithCStringson lo que en OOP se llaman métodos de fábrica estáticos. Métodos estáticos (definidos para una clase) que se utilizan para crear objetos)
Podemos acceder a los elementos del array de distintas formas. En
este caso hemos utilizado la forma foreach de
for para iterar sobre el array y también el mensaje
objectAtIndex sobre el objeto array. En el primer caso,
para ilustrar la conversión entre tipos C estándard, hemos imprimido el
valor del elemento del array con un printf normal, en lugar
de utilizar NSLog y el format string
%@. Así, para obtener el entero almacenado en un objeto de
tipo NSNumber, utilizaremos el mensaje
intValue.
Si bien, lo que estamos haciendo es ejecutar métodos sobre objetos de una determinada clase, la orientación a objetos de Objective C proviene de Smalltalk que ofrece un elegante y potente modelo. En Smalltalk la ejecución de un método se realizaba enviando un mensaje al objeto. El objeto que recibía el mensaje determinaba si se trataba de un mensaje que entendía o no y actuaba en consecuencia.
Así a primera vista no parece algo mucho más diferente de llamar a una función. Sin embargo cuando empezamos a tratar con orientación a objetos avanzada, (multi-dispatching, herencia, polimorfismo…) el modelo se muestra en todo su esplendor.
Si quisiéramos utilizar NSLog tendríamos un problema.
NSLog añade un retorno de carro siempre tras imprimir un
valor, de forma que no podríamos imprimir todos nuestros valores en la
misma línea con un bucle. En este caso, lo que hemos hecho ha sido crear
una cadena de caracteres y añadir los números uno tras otro, para
finalmente imprimir el resultado. Las partes relevantes del código son
las siguientes:
// Crea objeto de clase NSMutableString
NSMutableString *out = [NSMutableString alloc];
(...)
// Por cada elemento del array:
// -> Lo convertimos en cadena usando el mensaje stringWithFormat
// -> Lo añadimos a la cadena usando el mensaje appendString
for (it in a)
[out appendString: [NSString stringWithFormat:@"%@ ",
[it stringValue]]];
NSLog (@"%@", out);SUMARIO
- Todo lo que sabemos sobre la entrada de datos en C lo podemos aplicar directamente a Objective-C
- Objective-C y en concreto el framework NextStep/OpenStep nos ofrece muchas clases con las que simplificar nuestra vida.
■
