有没有从数组中获取浮点数的简便方法?

时间:2012-01-23 12:43:13

标签: iphone objective-c ios arrays boxing

我是目标C中的iPhone开发者的初学者,我发现我做了很多事情就是在各种NSArrays中进出浮点数(和整数)

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

我知道我需要做这个拳击因为float(或int)不是指针而且NSArray只接受指针。

我只是想知道是否有一点点语法糖来缩短这行代码 - 主要是因为当我有几个数组并且我循环它们来做一些处理我发现这些行开始变得越来越多大块,我必须打破从数组中提取数字只是为了使代码可读 - 然后我有很多gumph行,往往使逻辑更难遵循。

在像C#这样的语言中,我会写类似

的东西
float myResult = myArray[i] + someOtherArray[i+1];

(好吧 - 这可能是一段非常愚蠢的代码 - 但从语法上来说它非常干净,我想是因为.net在我无法看到的情况下隐含地进行拳击)

在目标C中我发现自己在写:

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

float myResult = myFloatValue + myOtherFloatValue;

我只是想知道我是否因为手写输入而错过了一个技巧。我应该使用NSArray的替代品吗?是否有装箱/拆箱的快捷方式?

或者我想,我应该习惯它并停止抱怨;)

5 个答案:

答案 0 :(得分:6)

您可以创建一个类别:

@class NSArray (FloatHelper)

- (float) floatAtIndex:(NSUInteger)i;

@end

@implementation NSArray (FloatHelper)

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

@end

(未经测试且没有错误处理,显然,这不是一个好主意。)

然后可以按如下方式使用:

float a = [array floatAtIndex:1];

答案 1 :(得分:2)

顺便说一下,我认为没有任何简写

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

是合法的。

答案 2 :(得分:1)

不幸的是,Objective-C不支持Auto-Boxing。

有关详细信息,请访问链接 - Aotoboxing in objective c?

答案 3 :(得分:1)

您可以使用较少详细的代码创建类别,函数或宏来执行此操作。

但是如果你在一个消耗大量CPU时间的循环中这样做(通过使用Instruments进行分析确定),你应该考虑使用C数组,这可以使用更少的CPU周期来访问,从而节省用户电池生活。如果多次触摸相同的元素,在进行计算循环之前,甚至可能需要优化将所有这些浮点数从NSArray复制到普通的C数组浮点数。

答案 4 :(得分:0)

为什么不创建宏

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

使用

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

只是停止打扰自己?