Entrada de Datos. Lenguaje Objective-C
SOLUCIONARIO
Entrada de Datos. Lenguaje Objective-C
2026-04-12
Por
Occam's Razor

#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.

SOY NOVATO

Todo lo que hemos comentado sobre el uso de scanf en 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

SOY NOVATO

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];

numberWithInt o stringWithCString son 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.

¿SABÍAS QUÉ?

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.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)