2012-06-16 8 views
17

mam obiektu z klasy NSObject, które nazywam „marka” i ma następujące właściwości:iOS - Znalezienie złożonego obiektu w tablicy

.name 
.number 
.site 

w danym czasie, dziesiątki tych obiektów są przechowywane na NSMutableArray, coś w stylu:

object 1 
object 2 
object 3 
object 4 
... 

Chciałbym móc pobrać dany obiekt z tablicy przez jego numer. Nie jest to indeks obiektu w tablicy, ale właściwość number obiektu (pobierz obiekt , który ma na przykład właściwość number równą 10).

Wiem, że NSArrays mają inteligentne metody odzyskiwania rzeczy, ale nie znam ich głęboko, ponieważ rzadko używam tego. Czy istnieje sposób na odzyskanie tego obiektu z tablicy bez konieczności wykonywania iteracji przez wszystkie obiekty w tablicy i sprawdzania właściwości liczbowych każdego obiektu?

Czy możecie pomóc? dzięki.

Odpowiedz

15

Polecam NSPredicate. Możesz zrobić to z czymś podobnym, zakładając, że listOfItems jest twoją tablicą zawierającą twoje NSObject z tymi właściwościami.

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

Twoje filtrowanych wyników, wszelkie numery pasujące 10 będzie teraz w tablicy filtered. Jeśli chcesz odrzucić do obiektu, możesz zrobić coś takiego:

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

Mam nadzieję, że to pomoże.

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

MyObject *object10 = myArray[indexOfObject10]; 
0

Może coś takiego:

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

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

Po pierwsze, utworzenie obiektu o tej samej liczbie jako obiekt w tablicy, że chcę, aby pobrać (w tym przypadku „1”). W następnym wierszu zakładam, że po jego pobraniu chcesz przypisać jego wartość do innego obiektu, więc pobieram go za pomocą standardowej metody objectAtIndex: z parametrem indeksu będącym inną metodą, metodą indexOfObjectIdenticalTo:, z parametrem tej metody będącym retriveObject obiekt. To, co to robi, wygląda w tablicy dla pierwszego obiektu identycznego z retrieveObject (co oznacza, że ​​mają ten sam numer) i zwraca indeks tego obiektu, a następnie przekazuje tę wartość do metody objectAtIndex.

Mam nadzieję, że to pomoże!

1

Preferuję używanie rozszerzeń bloków do NSArray, które umożliwiają "rozmowę" z nimi bardziej naturalnie i zapisanie mniejszej ilości kodu. Coś w liniach żargonie Smalltalk kolekcji:

  • wykrycia:
  • wybrać:
  • inject: do:
  • etc.

W twoim przypadku użyłbym:

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

Tutaj masz możliwą implementację tego rozszerzenia do NSArray

typedef BOOL (^BlockPredicate) (id element); 

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

mogę znaleźć tego rodzaju narzędzi naprawdę pomocne. Mam nadzieję, że również ci się przydadzą.

+0

co się stanie, jeśli tablica zawiera więcej niż jeden obiekt o tym samym numerze? – SpaceDog

+1

Ta implementacja "wykryje" i zwróci pierwszą. Jeśli chcesz znaleźć wszystkie wystąpienia o tym samym numerze, możesz użyć opcji select :. – Lio

+0

OK. Dziękuję za wyjaśnienie! – SpaceDog