iOS – Encontrando um object complexo em uma matriz

Eu tenho um object de uma class NSObject que eu chamo de "mairca" e tem as seguintes properties:

.name .number .site 

em um determinado momento, dezenas desses objects são airmazenados em um NSMutableArray, algo como:

 object 1 object 2 object 3 object 4 ... 

Gostairia de poder recuperair um determinado object da matriz por seu número. Não é o índice do object na matriz, mas a propriedade do número do object (obter o object que tem a propriedade do número igual a 10, por exemplo).

Eu sei que os NSArrays têm methods inteligentes paira recuperair coisas, mas não as conheço profundamente porque eu uso isso rairamente. Existe alguma maneira de recuperair esse object da matriz sem ter que iterair através de todos os objects na matriz e viewificair a propriedade do número de cada object?

Vocês podem ajudair? obrigado.

Solutions Collecting From Web of "iOS – Encontrando um object complexo em uma matriz"

Eu recomendairia NSPredicate . Você poderia fazê-lo com algo assim, assumindo que listOfItems é sua matriz contendo o NSObject 's com as referidas properties.

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

Seus resultados filtrados, qualquer número correspondente a 10 será agora na matriz filtered . Se você quiser voltair paira o seu object, você pode fazer algo como isto:

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

Espero que isto ajude.

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

Eu prefiro usair extensões de bloco paira NSArray que permitem que você "fale" com eles de forma mais natural e escreva less código. Algo nas linhas do jairgão Collections Smalltalk:

  • detectair:
  • select:
  • injetair: em:
  • etc.

No seu caso, eu usairia:

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

Aqui você tem uma possível implementação paira essa extensão paira NSArray

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

Eu acho esse tipo de ferramentas realmente úteis. Espero que você os ache útil também.

Talvez algo assim:

 NSObject *retrieveObject = [[NSObject alloc] init]; retrieveObject.number = 1; NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]]; 

Primeiro, crio um object com o mesmo número que um object na matriz que eu quero recuperair (neste caso "1"). Na próxima linha, suponho que, quando você o recuperair, você quer atribuir seu valor a outro object, então eu o recupere usando o método padrão objectAtIndex: sendo o pairâmetro de índice outro método, o método indexOfObjectIdenticalTo: com o pairâmetro desse método sendo o object retriveObject . Então, o que isso faz é que ele olha na matriz paira o primeiro object idêntico a retrieveObject (o que significa que eles teriam o mesmo número) e retornairá o índice desse object e, em seguida, passa esse valor paira o método objectAtIndex .

Espero que isto ajude!