2012-06-16 9 views
17

que tengo un objeto de una clase NSObject que me llame "marca" y tiene las siguientes propiedades:IOS - encontrar un objeto complejo en una matriz

.name 
.number 
.site 

en un momento dado, de estos objetos docenas se almacenan en un NSMutableArray, algo así como:

object 1 
object 2 
object 3 
object 4 
... 

me gustaría ser capaz de recuperar un objeto dado de la matriz por su número. No es el índice del objeto en la matriz, sino la propiedad de número del objeto (obtenga el objeto que tenga la propiedad de número igual a 10, por ejemplo).

Sé que los NSArrays tienen métodos inteligentes para recuperar cosas, pero no las conozco demasiado, porque las utilizo con poca frecuencia. ¿Hay alguna manera de recuperar ese objeto de la matriz sin tener que iterar a través de todos los objetos en la matriz y verificar la propiedad numérica de cada objeto?

¿Pueden ayudarme? Gracias.

Respuesta

15

Recomendaría NSPredicate. Podrías hacerlo con algo como esto, suponiendo que listOfItems es tu matriz que contiene tus NSObject con dichas propiedades.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"number == 10"]; 
NSArray *filtered = [listOfItems filteredArrayUsingPredicate:predicate]; 

Sus resultados filtrados, cualquier números que coinciden 10 estará ahora en la matriz filtered. Si quieres lanzar de nuevo a su objeto, puede hacer algo como esto:

YourObject *object = (YourObject*)[filtered objectAtIndex:0]; 

Espero que esto ayude.

12
NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    MyObject *object = (MyObject *)obj; 
    return [object.number == 10]; 
}]; 

MyObject *object10 = myArray[indexOfObject10]; 
0

Tal vez algo como esto:

NSObject *retrieveObject = [[NSObject alloc] init]; 
retrieveObject.number = 1; 

NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]]; 

En primer lugar, crear un objeto con el mismo número que un objeto en la matriz que quiero recuperar (en este caso "1"). En la siguiente línea, supongo que cuando la recupera desea asignar su valor a otro objeto, así que la recupero utilizando el método estándar objectAtIndex: con el parámetro de índice siendo otro método, el indexOfObjectIdenticalTo:, con el parámetro de ese método siendo el retriveObject objeto. Entonces, lo que hace es buscar en la matriz el primer objeto idéntico a retrieveObject (lo que significa que tendrían el mismo número) y devuelve el índice de ese objeto, y luego lo pasa al método objectAtIndex.

Espero que esto ayude!

1

Prefiero usar extensiones de bloque para NSArray que le permiten "hablar" con ellas de forma más natural y escribir menos código. Algo en las líneas de la jerga de Smalltalk Colecciones:

  • detectar: ​​
  • seleccione:
  • inyección: en:
  • etc.

En su caso yo usaría:

MyObject* theObject = [myArray detect:^(MyObject* each){ 
    return each.number == 10; 
}]; 

Aquí tienen una posible aplicación de esa extensión a NSArray

typedef BOOL (^BlockPredicate) (id element); 

-(id) detect:(BlockPredicate) predicateBlock{ 
    for (id each in self) { 
     if (predicateBlock(each)) { 
      return each; 
     } 
    } 
    return nil; 
} 

Encuentro este tipo de herramientas de gran ayuda. Espero que los encuentres útiles también.

+0

lo que sucede si la matriz contiene más de un objeto con el mismo número? – SpaceDog

+1

Esta implementación 'detectar' y restablecer el primero. Si desea conocer todos los casos con el mismo número, se puede usar de selección :. – Lio

+0

OK. ¡Gracias por la explicación! – SpaceDog

Cuestiones relacionadas