2011-09-13 17 views
59

estoy tratando de obtener el índice de una matriz a través de método de indexOfObject de la siguiente manera, pero cuando intento registrar el valor para probar el índice, obtengo un valor de basura ... para fines de prueba tengo una matriz con valores {57,56,58..} para obtener un índice de 56 digamos,Obteniendo el índice de un objeto de NSArray?

NSNumber *num = [NSNumber numberWithInteger:56]; 
NSInteger Aindex = [myArray indexOfObject:num]; 
NSLog(@" %d",Aindex); 

el valor que consigo es algo así como 2323421. ¿Qué estoy haciendo mal?

+0

¿Está realmente insertándolo en la matriz? –

+0

** Qué tipo de valor de tipo de datos contiene myArray ** –

+0

Estaba agregando un valor de NSString a una matriz y comparando el objeto de la matriz con un NSNumber ... no pensé que sería un problema pero finalmente tuve que comparar el objeto con una cadena valor para hacerlo bien ... – hemant

Respuesta

134

El índice devuelto por indexOfObject será el primer índice para una ocurrencia de su objeto. La igualdad se prueba usando el método isEqual.
El valor de basura que obtiene es probablemente igual a NSNotFound.
Pruebe probar anIndex en su contra. El número que se busca no es probable que en su conjunto:

NSNumber *num=[NSNumber numberWithInteger:56]; 
NSInteger anIndex=[myArray indexOfObject:num]; 
if(NSNotFound == anIndex) { 
    NSLog(@"not found"); 
} 

o ingrese el contenido de la matriz para estar seguro:

NSLog(@"%@", myArray); 
+0

Estaba agregando un valor de NSString a la matriz y comparando el objeto de la matriz con un NSNumber ... no pensé que sería un problema, pero finalmente tuve que comparar el objeto con un valor de cadena para hacerlo bien ... – hemant

+1

Thx para 'NSNotFound' ... –

+0

¿Qué pasa si tengo el mismo objeto varias veces? –

0

acabo de comprobar. esta trabajando bien para mi. Compruebe si su matriz tiene el número en particular. Devolverá tales valores basura si el elemento no está presente.

6
NSNumber *num1 = [NSNumber numberWithInt:56]; 
    NSNumber *num2 = [NSNumber numberWithInt:57]; 
    NSNumber *num3 = [NSNumber numberWithInt:58]; 
    NSMutableArray *myArray = [NSMutableArray arrayWithObjects:num1,num2,num3,nil]; 
    NSNumber *num=[NSNumber numberWithInteger:58]; 

    NSInteger Aindex=[myArray indexOfObject:num]; 

    NSLog(@" %d",Aindex); 

Dando la salida correcta, puede haber hecho algo mal al almacenar objetos en su arreglo.

+0

Buen trabajo ..... ¡¡Trabajo !! –

38

gente,

Cuando un objeto no se encuentra en la matriz del método indexOfObject NO devuelve un valor 'basura'. Muchos sistemas devuelven un índice de -1 si el elemento no se encuentra.

Sin embargo, en IOS, porque indexOfObject devuelve UNSIGNED int (también conocido como NSUInteger), el índice devuelto debe ser mayor o igual a cero. Como 'cero' es un índice válido, no hay forma de indicarle a la persona que llama que no se encontró el objeto, excepto al devolver un valor constante acordado sobre el que todos podamos poner a prueba. Este valor constante acordado se llama NSNotFound.

El método:

- (NSUInteger)indexOfObject:(id)anObject; 

volverá NSNotFound si el objeto no estaba en el array. NSNotFound es un entero POSITIVO muy grande (generalmente 1 menos el máximo int en la plataforma).

+0

@joe Si hace CMD + clic en NSNotFound, verá que está definido como 'enum {NSNotFound = NSIntegerMax};'. Sé que tanto NSIntegerMax como NSUIntegerMax son positivos, pero ¿no habría sido más sensato usar NS ** U ** IntegerMax ya que se usa en funciones que devuelven NSUInteger? Además, ¿qué sucede si estoy buscando un objeto que se coloca en el índice NSIntegerMax de la matriz? ¿No me engañarían para que creara que el objeto es NSNotFound? – Pwner

5

Prueba esto: método

de NSArray indexOfObject:. Tales como los siguientes:

NSUInteger fooIndex = [someArray indexOfObject: someObject]; 
0

indexOfObject methord obtendrá el índice de la cadena correspondiente en esa matriz si la cadena es como @ "Prueba" y te encuentras como @ "TEST" Ahora esto retun un índice como una número largo

1

Si está utilizando Swift y opcionales, asegúrese de que estén desenvueltos. No puede buscar en el índice de objetos que son opcionales.

Cuestiones relacionadas