2012-11-09 15 views
7

Pracuję nad kategorią dla NSArray, a jedna z zaimplementowanych przeze mnie funkcji ma na celu zwrócenie liczby łańcuchów (lub liczb) w tablicy. Wszystko działa dobrze, ale moje pytanie dotyczy użycia NSNotFound jako zwrotu w przypadku, gdy liczba tablic wejściowych wynosi zero.Czy powracający NSNotFound dla NSUInteger jest wskazany?

Apple docs stan:

NSNotFound jest zwykle używany przez różnych metod i funkcji, które wyszukiwania dla elementów w danych szeregowych i powrotu wskaźników, takich jak znaki w obiekcie String lub identyfikatory w obiekcie NSArray.

To ma sens, gdybym użył indexOfObject: dla przedmiotu, który nie był w tablicy. Ale używa się NSNotFound w kontekście pokazanym poniżej poprawnego użycia? Pewnie, że mogę po prostu zwrócić zero i nazwać to dziennie, ale byłoby pomocne zobaczenie 2147483647 i natychmiastowe poznanie, gdzie jest problem.

- (NSUInteger)countOfStringsInArray { 
    NSUInteger currentCount = 0; 
    if ([self count] > 0) { 
     for (id obj in self) { 
      if (![obj integerValue]) { 
       currentCount ++; 
      } 
     } 
     return currentCount; 
    } 
    return NSNotFound; 
} 

Odpowiedz

5

Nie, nie w tym przypadku. Metoda w tym przykładzie zwraca liczbę count. Można rozważyć użycie/zwrócenie NSNotFound (na przykład) na metodzie, która zwraca indeks, gdzie 0 jest również prawidłowy indeks, a zatem wynik fałszywie reprezentatywny.

So „Tak, powinien po prostu powrócić 0 i typ zwracany powinien być podpisany (NSUInteger)”, ponieważ NSNotFound powinny nie być związany z liczbą. To naprawdę obejmuje twoje sprawy bez zależności od magicznej wartości.

Jeśli wolisz wiedzieć, gdzie jest problem (a robię to dość często), uważam, że lepiej jest zamiast tego uznać za błąd programisty wywołanie metody, gdy kolekcja jest pusta.

2

Nie sądzę, aby liczba mogła być określana jako NSNotFound. Liczba może wynosić 0 lub więcej. To nigdy nie może być "Nie znaleziono", moim zdaniem. Jeśli tak, to [NSArray count] powinien zwrócić NSNotFound, gdy tablica jest pusta lub tablica jest zerowa, prawda? Krótko mówiąc, uważam, że używanie w tym konkretnym przypadku NSNotFound nie jest standardową metodą. Przynajmniej jabłko nigdy nie użyłoby go w ten sposób.

Prawdopodobnie możesz użyć zera jako domyślnego przypadku, bo inaczej będziesz musiał zdefiniować własne wyliczenie, aby to reprezentować. NSNotFound jest przydatna tylko wtedy, gdy nie możesz użyć wartości zerowej jako wartości domyślnej (w tych przypadkach wartość -1 można ustawić jako wartość domyślną, jeśli jest ona akceptowalna lub można użyć NSNotFound, ponieważ reprezentują one NSIntegerMax).

1

Widzę, skąd przybywasz, szczególnie biorąc pod uwagę sugerowane użycie NSNotFound. Jednak dla późniejszego programisty, który dziedziczy ten kod, nie sądzę, aby sugerowana implementacja była intuicyjna.

Polecam zamiast tego używać wartości zwracanej NSRange. Według definicji Apple NSRange jest "strukturą używaną do opisania części serii - takich jak znaki w łańcuchu lub obiektach w obiekcie NSArray". Właśnie to masz.

W szczególności, elementem lokalizacyjnym NSRange może być indeks pierwszego ciągu znalezionego w tablicy, a członem długości może być liczba znalezionych łańcuchów.

Podobnie jak inne metody zwracające NSRange (np. NSString: rangeOfString), można ustawić lokalizację na NSNotFound, jeśli nie zostaną znalezione żadne ciągi.

Nadzieję, że pomaga.

0

NSNotFound jest dla niepodpisanych int więc należy zwrócić go z metody NSInteger jak zostanie ona skrócona i być źle (potencjalnie)

który powiedział: ** metoda „countOfStringsInArray” powinien wrócić n NSUInteger (tak samo jako nsarray.count)

Powiązane problemy