jueves, 16 de febrero de 2012

Colectores en Xcode

En esta entrada hablaremos de los diferentes colectores que existen en Xcode, veremos varios ejemplos para saber para cuando usarlos y para que nos sirven, esto le tomó mucha importancia ya que la mayoría de los programadores tienden a almacenar en un solo tipo de colector para no complicarse la vida al programar algo.Para ello tienes que contar con algún conocimiento básico de Objective-C, si no tienes alguna idea de que es este lenguaje de programación te recomiendo que pases a mi blog de lenguajes de programación en la cual tengo una introducción de programación orientada a objetos con Objective-C, pueden entrar con el link que dejaré debajo.


Los colectores son algo fundamental al momento de aprender Objective-C, algunas veces también son referidos como contenedores.Los colectores son un tipo de clase que pueden guardar y manejar varios objetos, en sí el proposito de estos es proveer una manera en la que puedas guardar y recuperar varios objetos de una manera eficiente.

Hay diferentes tipos de colectores pero de los más comunes que veremos en está entrada serán los siguientes:

  • NSSet

  • NSArray

  • NSDictionary

  • NSMutableSet

  • NSMutableArray

  • NSMutableDictionary

Como verán en la lista hay unos tipos de colectores que se les agrego la palabra clave Mutable, en Objective-C existen dos tipos los que son Mutables y No Mutables lo que estos dos tipos tienen en común es que pueden agregarse elementos y removerlos después de aver sido creados, ya que definimos que tienen en común ahora mencionaremos que es lo que los diferencia uno de otro, Mutable significa que puede ser modificado,por lo tanto, desde el inicio hasta el final puede ser modificado.No Mutables significa que después de aver sido inicializados con algunos valores no puede ser modificado.

Ahora empezaremos a definir cada uno de los colectores:

NSSet

En está clase es usada para almacenar una lista de objetos desordenada, lo que significa que los objetos pueden ser almacenados sin considerar su orden, la ventaja de está clase es que es el colector más rápido.

Ahora veremos un ejemplo de como se inicializa NSSet :

NSSet *lista = [NSSet setWithObjects:@"Algo", @"Genetico", @"Don Pedro", nil];

Como verán este es un ejemplo de una lista de strings, en donde la ultimo objeto tiene que ser nil y esto indica que la lista de objetos a sido finalizada.Este ejemplo no implica que tiene que ser solamente utilizado solo para strings, este puede estar compuesto por diferentes tipos de objetos.

Aquí tenemos un ejemplo muy común utilizado con la clase NSSet que se utiliza especialmente cuando se intenta capturar las veces que haz tocado la pantalla normalmente les dicen touches.

NSSet *lista [NSSet setWithObjects: @"Algo", @"Genetico", @"Don Pedro", nil];

NSString *valor = [lista anyObject];

Lo que vemos en la tercer linea un método que llamamos llamado anyObject que básicamente toma cualquier objeto que está dentro de lista, esto es sumamente necesario ya que en algunos casos algunas aplicaciones con solo tocar la pantalla, con al menos un dedo hacen algo en consecuencia.

NSArray

A diferencia de NSSet, NSArray te permite recuperar los objetos por un index que están en un arreglo en donde el index está enumerado con la posición en el cual el objeto ocupa.

Para ello veremos un ejemplo de usando NSArray donde asignaremos varios strings y los llamaremos con un index.

NSArray *Arreglo = [NSArray arrayWithObjects: @"Algo", @"Malo", @"Telefono",nil];

NSLog (@"%@", [Arreglo objectAtIndex:0]);
NSLog (@"%@", [Arreglo objectAtIndex:1]);
NSLog (@"%@", [Arreglo objectAtIndex:2]);

Impresión de resultado:


Esto es sencillo de explicar prácticamente el método objectAtIndex seguido del número de la posición del objeto es el que será tomado e imprimido por medio de NSLog.

Para saber el tamaño de un array o arreglo puede ser calculado de una manera muy sencilla por medio de esta manera:

int contador = [Arreglo count];

Impresión de resultado donde se logra apreciar en el debugger:


Como podrán observar para tener el tamaño primero debemos darle el nombre en este caso lo llamamos Arreglo y luego count que significa que contará el tamaño del Arreglo.

NSDictionary

La clase de NSDictionary en diferencia de NSArray y NSSet es que pueden crear una lista de objetos con index en el cual puede ser compuesta por otra lista que comúnmente las llamamos keys, el problema aquí es que no podemos repetir ninguna key.Dentro de la lista de objetos pueden ser agregados mas listas de objetos.

Ahora veremos un ejemplo:

NSDictionary *zoologico = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"elefante", miObjetoElefante,
                               @"jirafa", miObjetoJirafa,
                               @"mono", [NSDictionary dictionaryWithObjectsAndKeys:
                                         @"Araña", miMonoAraña,
                                         @"Capuchino", miMonoCapuchino,
                                         @"Orangutan", miMonoOrangutan,nil]
                               @"zebra", miObjetoZebra, nil];

Este es un ejemplo de como se usa NSDictionary donde le estamos dando el objeto que en este caso colocamos un String  y después nuestra key para identificarla, con la condición de que no se repita.

Y la gran pregunta como manejarlos, o como identificarlos  tal ves creas que es algo mitico pero no lo es primero tenemos que identificar de que clase son para hacer esto mas didáctico supongamos que zebra, mono, elefante y jirafa son objetos de la clase NSDictionary y que la lista de monos son objetos de la clase Animal, ahora veremos el ejemplo para identificarlos uno de otro.

      for(id element in [zoologico allValues]){
         if ([element isKindOfClass:[Animal class]]){
             NSLog(@"Eres de la clase Animal");
       }
       if([element isKindOfClass:[NSDictionary class]]) {
             NSLog(@"Eres de la clase NSDictionary");
       }
     }
             

Primero que nada definamos por que usamos id, bueno id se utiliza cuando realmente no sabemos que clases están almacenadas en el colector.Como se observa toma todo lo que contenga zoologico con la palabra clave allValues y hace una iteración por cada elemento en el, luego dentro del if pregunta si dicho elemento es de la clase Animal si es así imprime Eres de la clase Animal y lo mismo sucede con el otro if.Esto funciona gracias al metodo llamado isKindOfClass que regresa un valor boleano si es la clase que estamos buscando nos retornara un True en caso contrario un False.

Hasta aquí hemos visto nadamas clases No Mutables, como lo habíamos comentado una vez que inicializan no podrán ser cambiadas, ahora veremos clases Mutables que estas si pueden ser modificadas una vez que han sido inicializadas.

NSMutableSet

Este contenedor puede ser inicializado de igual manera que el NSSet o puede ser inicializado sin ningún valor para posteriormente agregar algunos objetos.

Ahora veremos un ejemplo de ello:

NSMutableSet *lista = [[NSMutableSet alloc] init];
 [lista addObject:@"Algo"];
 [lista addObject:@"Genetico"];
 [lista addObject:@"Don Pedro"];

 for (id valor in lista) {
 NSLog(@"%@", valor);
 }

Como veremos inicializamos nuestro contenedor con el nombre de lista, luego agregamos en cada línea un objeto diferente con el método addObject, después para imprimirlo por medio de un for donde tomará todo el contenido de lista y gracias a id mostrara cada uno de ellos y será imprimido por NSLog.Ahora veremos una captura de la consola.



Ahora si queremos eliminar todos los objetos haremos lo siguiente por el método llamado removeAllObjects.

[lista removeAllObjects];

Ahora que pasa si queremos eliminar un objeto en especifico, bueno lo que tenemos que hacer es lo siguiente:

NSString *Cosa =@"Cosa";

 [lista addObject: Cosa];
 [lista addObject: Cosa];
 
 for (id valor in lista){
     NSLog(@"%@",valor);
  }
 
 [lista removeObject: Cosa];

 for (id valor in lista){
     NSLog(@"%@", valor);
 }

Ahora como observamos creamos una variable Cosa tipo String en la cual posteriormente la agregamos a lista, se agregó dos veces para demostrar que no podemos repetir el mismo objeto mas de dos veces, luego utilizamos el for para demostrar que se agregaro el objeto, después usaremos el método removeObject seguido del objeto que queremos eliminar para luego pasar al otro for para comprobar que se haya eliminado si todo salió bien verás algo como esto.


NSMutableArray

Este contenedor es lo mismo a usar un NSArray con diferencia de que pueden ser agregadas, modificadas y eliminadas, algo interesante que agregar es que podemos utilizar los métodos anteriores que utilizamos con NSMutableSet.

Ahora veremos un ejemplo agregando e insertando objetos:

 NSMutableArray *Arreglo = [[NSMutableArray alloc] init];
    
    [Arreglo addObject:@"Algo"];
    [Arreglo addObject:@"Pasa"];
    [Arreglo addObject:@"Siempre"];
     
     for(id valor in Arreglo){
     NSLog(@"%@", valor);
     }
     
     [Arreglo insertObject:@"Inserte algo entre Algo y Pasa"];
    
    for(id valor in Arreglo){
        NSLog(@"%@", valor);
    }

Lo que hicimos fue agregar el objeto(lo mismo que en NSSet) luego demostramos que han sido agregados en el for, después insertamos un objeto en el index 1 esto quiere decir que se posicionará en la posición 1 y se recorrerán los demás hacia abajo, como podrán observar debajo.

Los métodos mas usamos son removeAllObjects que quita todos los objetos que esten dentro del contenedor, removeLastObject que quita el último objeto agregado del contenedor, removeObjectAtIndex que este remueve un objeto dependiendo del index que haya sido dado.

NSMutableDictionary

Este contenedor no es muy diferente a NSDictionary, ya que este te provee de los mismo con la diferencia que poder agregar y remover elementos.

A continuación veremos un ejemplo agregando objetos:


 NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
 
 [dic setObject:@"Primero" forKey:@"1"];
 [dic setObject:@"Segundo" forKey:@"2"];
 [dic setObject:@"Tercero" forKey:@"3"];

 for(id valor in dic){
    NSLog(@"%@", valor);
 }
 
 [dic setObject:@"Primero y Segundo" forKey:@"1.5"];
 
 for(id valor in dic){
    NSLog(@"%@", valor);
 }

Agregamos tres objetos con ciertas keys, luego comprobamos que están, ya comprobadas agregamos un objeto, usamos el for para verificar lo que sucedió:


Como podrán ver se agregó un nuevo objeto con que no puede ser insertada en una posición en especifico como NSArray.

Libro de referencia:
Objective-C for Absolute Beginners, Excelente libro se los recomiendo

1 comentario: