Frage Gibt es eine Abkürzung, um einen Float von einem Array zu erhalten?


Ich bin ein Anfänger mit iPhone Dev in Objective C und eine Sache, die ich finde, ich mache ziemlich viel ist Floaten (und Ints) in und aus verschiedenen NSArrays

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

Ich verstehe, dass ich dieses Boxen machen muss, weil ein float (oder int) kein Zeiger ist und das NSArray nur Zeiger akzeptiert.

Ich frage mich nur, ob es ein wenig syntaktischen Zucker gibt, um diese Codezeile zu verkürzen - hauptsächlich, weil, wenn ich ein paar Arrays habe und ich sie überschlinge, um etwas zu verarbeiten, finde ich, dass die Zeilen massiv werden und ich müssen die Zeilen ausbrechen, die die Zahl aus dem Array extrahieren, nur um den Code lesbar zu machen - dann habe ich viele Kausalstriche, die dazu neigen, die Logik schwieriger zu machen.

In einer Sprache wie C # würde ich so etwas schreiben

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

(ok - das ist wahrscheinlich eine ziemlich dumme Zeile Code - aber syntaktisch ist es ziemlich sauber, ich denke, weil .net implizit das Boxen macht, wo ich es nicht sehen kann)

In Ziel C finde ich mich schriftlich:

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

float myResult = myFloatValue + myOtherFloatValue;

Ich frage mich nur, ob ich hier einen Trick verpasse, indem ich alles aus der Hand tippe. Sollte ich eine Alternative zu NSArray verwenden? Gibt es eine Abkürzung für das Boxen / Unboxing?

Oder denke ich, sollte ich mich einfach daran gewöhnen und aufhören zu jammern;)


5
2018-01-23 12:43


Ursprung


Antworten:


Sie können eine Kategorie erstellen:

@class NSArray (FloatHelper)

- (float) floatAtIndex:(NSUInteger)i;

@end

@implementation NSArray (FloatHelper)

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

@end

(Ungetestet und hat keine Fehlerbehandlung, was offensichtlich keine gute Idee ist.)

Dann könnte es wie folgt verwendet werden:

float a = [array floatAtIndex:1];

6
2018-01-23 12:59



Ich glaube übrigens, dass es dafür keine Abkürzungen gibt

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

ist legal.


2
2018-01-23 12:52



Leider unterstützt Objective-C kein Auto-Boxing.

Für weitere Informationen besuchen Sie bitte den Link -Aotoboxen in Ziel c?


1
2018-01-23 12:50



Sie können eine Kategorie, eine Funktion oder ein Makro erstellen, um dies mit weniger ausführlichen Code zu tun.

Wenn Sie dies jedoch in einer Schleife tun, die eine erhebliche CPU-Zeit verbraucht (wie durch Profilerstellung mit Instruments ermittelt), sollten Sie stattdessen ein C-Array in Betracht ziehen, auf das mit wesentlich weniger CPU-Zyklen zugegriffen werden kann. Wenn Sie die gleichen Elemente mehrmals berühren, könnte es sogar eine Optimierung sein, alle diese Floats von einem NSArray in ein einfaches C-Array von Floats zu kopieren, bevor Sie Ihre Berechnungsschleife ausführen.


1
2018-01-23 16:05



Warum tust du nicht? Erstelle ein Makro,

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

benutze es,

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

und nur Hör auf zu stören dich selber?


0
2018-01-23 12:51