2012-01-23 8 views
5

Sono un principiante con iPhone dev in Objective C e una cosa che trovo sto facendo un bel po 'è sempre galleggianti (e int) dentro e fuori di vari NSArraysEsiste un modo per ottenere una virgola mobile da un array?

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

ho capito che ho bisogno per fare questo boxing perché un float (o int) non è un puntatore e NSArray accetta solo puntatori.

Mi stavo chiedendo se c'è un po 'di zucchero sintattico per accorciare questa linea di codice - principalmente perché quando ho un paio di array e li sto eseguendo su di loro per fare un po' di elaborazione, trovo che le linee iniziano diventando massiccio e devo rompere le linee che estraggono il numero dalla matrice solo per rendere leggibile il codice - quindi ho molte linee di gomma che tendono a rendere la logica più difficile da seguire.

in un linguaggio come C# vorrei scrivere qualcosa di simile

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

(ok - che è probabilmente una linea abbastanza stupida di codice - ma sintatticamente è abbastanza pulito, credo perché .net sta facendo la boxe implicitamente in cui non riesco a vedere)

in CI obiettivo trovo a scrivere:

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

float myResult = myFloatValue + myOtherFloatValue; 

mi chiedo solo se mi manca un trucco qui digitando tutto fuori longhand. Dovrei usare un'alternativa a NSArray? C'è una scorciatoia per il pugilato/unboxing?

o credo, devo solo farci l'abitudine e smettere di lamentele;)

+0

No, Objective-C fa schifo. Ma puoi usare un array C se stai semplicemente memorizzando i float. Il problema con i C array è l'allocazione dinamica della memoria. – vakio

+0

Beh, per lo meno, perché stai lanciando? Questo non è C++. Puoi inviare qualunque messaggio tu voglia ad un oggetto 'id'. – StilesCrisis

risposta

6

È possibile creare una categoria:

@class NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i; 

@end 

@implementation NSArray (FloatHelper) 

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

@end 

(testato e non ha la gestione degli errori, che, ovviamente, non è una buona idea.)

allora potrebbe essere utilizzato come segue:

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

+1 Ottimo! Non ci ho pensato mentre rispondevo ;-) – EmptyStack

+0

@Stephen: Non sono sicuro di cosa stia succedendo nel codice che hai postato qui - per esempio da dove viene myArray in questo caso? Inoltre, solo le cose basilari come - dove mettere queste dichiarazioni. Sono un principiante con l'obiettivo C e non ho abbastanza contesto qui, non credo che tu abbia un link ad un tutorial o documentazione che mi aiuti a capire meglio la tua risposta? –

+1

Siamo spiacenti, 'myarray' era un errore di copia e incolla. Dovrebbe essere autonomo. Vedi qui per la documentazione: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html –

0

Perché non si creare una macro,

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

usano,

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

e proprio smettila di preoccuparti di?

+0

Chi è quel simpatico ragazzo ha votato la mia risposta! Perché il voto negativo? La mia risposta è davvero un'idea dannosa! Io non la penso così! – EmptyStack

2

non credo che ci sia alcuna scorciatoia per che, tra l'altro

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

è legale.

1

È possibile creare una categoria, una funzione o una macro per eseguire questa operazione con un codice meno dettagliato.

Ma se si sta facendo questo in un ciclo che consuma tempo significativo della CPU (come determinato dalla profilazione con strumenti), si dovrebbe prendere in considerazione l'utilizzo di un array C, che è possibile accedere utilizzando molto meno cicli della CPU, quindi conservando gli utenti durata della batteria. Se si toccano gli stessi elementi più volte, potrebbe anche essere un'ottimizzazione copiare tutti questi float da un NSArray ad un semplice array C di float prima di eseguire il ciclo di calcolo.

Problemi correlati