2011-09-13 15 views
59

Próbuję uzyskać indeks tablicy poprzez metoda indexOfObject w następujący sposób, ale gdy próbuję zarejestrować wartość, aby przetestować indeks, otrzymuję wartość śmieci .. dla celów testowych mam tablicę z wartościami {57,56,58..}, aby uzyskać indeks powiedzmy 56,Uzyskiwanie indeksu obiektu z NSArray?

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

wartość mogę to coś 2323421. co ja mogę robić źle?

+0

Czy faktycznie wstawiasz go do tablicy? –

+0

** Jaki rodzaj danych wartość twoja myArray zawiera ** –

+0

Dodałem wartość NSString do tablicy i porównując obiekt tablicy z NSNumber .. nie myślałem, że to będzie problem, ale w końcu musiał porównać obiekt z ciągiem wartość, aby to dobrze .. – hemant

Odpowiedz

134

Indeks zwrócony przez indexOfObject będzie pierwszym wskaźnikiem wystąpienia obiektu. Równość jest testowana przy użyciu metody isEqual.
Wartość śmieci, którą otrzymasz, jest prawdopodobnie równa NSNotFound. Przetestuj anIndex przeciwko niemu. Liczba szukasz prawdopodobnie nie jest w swojej tablicy:

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

lub zalogować zawartość tablicy, aby mieć pewność:

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

Dodałem wartość NSString do tablicy i porównując obiekt tablicy z NSNumber .. nie myślałem, że będzie to problem, ale w końcu musiał porównać obiekt z wartością ciągu, aby uzyskać to prawo .. – hemant

+1

Thx dla 'NSNotFound' ... –

+0

Co zrobić, jeśli mam ten sam obiekt wiele razy? –

0

Właśnie sprawdziłem. Działa dobrze dla mnie. Sprawdź, czy twoja tablica ma określony numer. Zwróci takie wartości śmieci, jeśli element nie jest obecny.

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); 

Daje prawidłowy wynik, może zrobiłeś coś nie tak z przechowywaniem obiektów w tablicy ur.

+0

Dobra robota ..... Praca! –

38

Ludzie,

Jeżeli obiekt nie znajduje się w tablicy Sposób indexOfObject nie powróci do wartości "śmieci. Wiele systemów zwraca indeks -1, jeśli element nie zostanie znaleziony.

Jednak na IOS - ponieważ indexOfObject zwraca UNSIGNED int (inaczej NSUInteger) zwracany indeks musi być większy lub równy zeru. Ponieważ "zero" jest poprawnym indeksem, nie ma możliwości wskazania dzwoniącemu, że obiekt nie został znaleziony - z wyjątkiem zwracania uzgodnionej stałej wartości, którą wszyscy możemy przetestować. Ta stała uzgodniona wartość nosi nazwę NSNotFound.

Metoda:

- (NSUInteger)indexOfObject:(id)anObject; 

powróci NSNotFound jeśli obiekt nie było w układzie. NSNotFound jest bardzo dużą POZYTYWNĄ liczbą całkowitą (zwykle 1 minus maksymalna liczba int na platformie).

+0

@joe Jeśli klikniesz CMD + NSNotFound, zobaczysz, że jest zdefiniowany jako 'enum {NSNotFound = NSIntegerMax};'. Wiem, że zarówno NSIntegerMax, jak i NSUIntegerMax są pozytywne, ale czy nie byłoby rozsądniej używać NS ** U ** IntegerMax, ponieważ był używany w funkcjach zwracających NSUInteger? Co się stanie, jeśli szukam obiektu umieszczonego w indeksie NSIntegerMax tablicy? Czy nie dałoby się mniemać, że obiekt jest NSNotFound? – Pwner

5

Spróbuj tego: indexOfObject: metodę

NSArray użytkownika. Takie jak:

NSUInteger fooIndex = [someArray indexOfObject: someObject]; 
0

indexOfObject methord dostanie indeks odpowiedniego napisu w tej tablicy, jeśli ciąg jest jak @ „Test” i znaleźć się jak @ „TEST” Teraz to będzie retun indeks niczym długi numer

1

Jeśli używasz Swift i opcji, upewnij się, że są one rozpakowane. Nie można przeszukiwać indeksu obiektów, które są opcjami.

Powiązane problemy