2012-01-23 14 views
5

Jestem początkujący z iPhone Dev w Objective C i jedno znajdę robię sporo jest coraz pływaków (i ints) iz różnych NSArraysCzy jest jakiś skrótowy sposób na uzyskanie float z tablicy?

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:integerSelector] floatValue]; 

Rozumiem, że muszę zrobić to pole, ponieważ float (lub int) nie jest wskaźnikiem, a NSArray akceptuje tylko wskaźniki.

Zastanawiam się, czy jest trochę syntaktycznego cukru, aby skrócić tę linię kodu - głównie dlatego, że gdy mam kilka tablic i pętlę nad nimi, aby wykonać pewne przetwarzanie, stwierdzam, że linie zaczynają się staje się masywny i muszę przełamać linie, które wyodrębniają liczbę z tablicy tylko po to, aby kod był czytelny - wtedy mam dużo linii gumpha, które sprawiają, że logika jest trudniejsza do naśladowania.

w języku jak C# Chciałbym napisać coś

float myResult = myArray[i] + someOtherArray[i+1]; 

(OK - to chyba całkiem głupi wiersz kodu - ale składniowo to dość czyste, myślę, ponieważ .net robi boks niejawnie gdzie nie mogę go zobaczyć)

w obiektywnej CI znajduję się pisząc:

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:i] floatValue]; 
float myOtherFloatValue = [(NSNumber *)[someOtherArray objectAtIndex:i+1] floatValue]; 

float myResult = myFloatValue + myOtherFloatValue; 

Zastanawiam się tylko, czy jestem brakuje trick tutaj, wpisując to wszystko odręcznie. Czy powinienem używać alternatywy dla NSArray? Czy istnieje skrót do boksu/rozpakowywania?

Albo Chyba, należy po prostu do tego przyzwyczaić i przestać whinging;)

+0

Nie, Objective-C jest do bani. Ale możesz użyć tablicy C, jeśli tylko przechowujesz zmienne. Problem z tablicami C to dynamiczna alokacja pamięci. – vakio

+0

Cóż, przynajmniej dlaczego w ogóle rzucasz? To nie jest C++. Możesz wysłać dowolną wiadomość do obiektu 'id'. – StilesCrisis

Odpowiedz

6

Można utworzyć kategorię:

@class NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i; 

@end 

@implementation NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i { 
    return [[self objectAtIndex:i] floatValue]; 
} 

@end 

(niesprawdzone i nie ma obsługi błędów, co, oczywiście, nie jest dobrym pomysłem.)

może to być wykorzystane w następujący sposób:

float a = [array floatAtIndex:1]; 
+0

+1 Świetnie! Nie zastanawiałem się nad tym, odpowiadając ;-) – EmptyStack

+0

@ Stephen: Nie jestem pewien, co się dzieje w kodzie, który tu zamieściłeś - na przykład, skąd pochodzi myArray w tym przypadku? Ponadto, po prostu podstawowe rzeczy - gdzie umieścić te deklaracje. Jestem początkującym z obiektywnym C i nie mam tu wystarczającego kontekstu, nie przypuszczam, że masz link do samouczka lub dokumentacji, która pomoże mi lepiej zrozumieć twoją odpowiedź? –

+1

Niestety, 'myarray' był błędem typu" cut and paste ". To powinno być samo. Zobacz dokumentację: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html –

0

Dlaczego nie utworzyć makro,

#define _floatValue(array, index) [(NSNumber *)[array objectAtIndex:index] floatValue] 

używać go,

float myFloatValue = _floatValue(myArray, i); 
float myOtherFloatValue = _floatValue(someOtherArray, i+1); 
float myResult = myFloatValue + myOtherFloatValue; 

i tylko przestań się martwić sam?

+0

Kto jest tym zabawnym facetem głosującym na moją odpowiedź! Dlaczego głosowanie w dół? Czy moja odpowiedź to naprawdę szkodliwy pomysł! Nie sądzę! – EmptyStack

2

Nie sądzę, istnieje jakikolwiek skrótem, który, nawiasem mówiąc

float myFloatValue = [[myArray objectAtIndex:i] floatValue]; 

jest legalne.

1

Można utworzyć kategorię, funkcję lub makro, aby wykonać tę czynność za pomocą mniej szczegółowego kodu.

Ale jeśli robisz to w pętli, która zużywa znaczny czas procesora (jak określono przez profilowanie z Instrumentami), powinieneś rozważyć użycie tablicy C, która może być dostępna przy użyciu o wiele mniej cykli procesora, oszczędzając w ten sposób użytkowników żywotność baterii. Jeśli dotykasz tych samych elementów wiele razy, może to być nawet optymalizacja, aby skopiować wszystkie te przepływy z NSArray do zwykłej tablicy C floats przed wykonaniem pętli obliczeniowej.

Powiązane problemy