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

5

我是一名初学者,在Objective C中进行iPhone开发,我发现自己经常需要将浮点数(和整数)从各种NSArray中取出或放入其中。

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

我知道需要进行boxing是因为浮点数或整数不是指针,而NSArray仅接受指针。
我想知道是否有一些语法糖可以缩短这行代码-大多数情况下,当我有几个数组并循环它们以进行一些处理时,我发现代码行开始变得巨大,我必须分开提取数组中的数字才能使代码可读性好-然后我就有很多废话的行,往往会使逻辑更难以理解。
在像C#这样的语言中,我会写出类似以下的代码:
float myResult = myArray[i] + someOtherArray[i+1];

嗯——这可能是一行很愚蠢的代码——但从语法上来说,它相当干净。我猜是因为.net在我看不见的地方隐式地进行装箱操作。

在Objective-C中,我发现自己写下了以下代码:

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

float myResult = myFloatValue + myOtherFloatValue;

我在想,手打代码是否有更好的方法呢?我应该使用NSArray的替代方案吗?是否有装箱/拆箱的快捷方式?

或者,我应该习惯这种方式,不再抱怨呢 ;)


不,Objective-C很糟糕。但是如果你只是存储浮点数,可以使用C数组。 C数组的问题在于动态内存分配。 - vakio
至少,你为什么还要进行强制类型转换呢?这可不是C++。对于id对象来说,你可以发送任何你想要的消息。 - StilesCrisis
5个回答

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];

@Stephen:我不确定你在这里发布的代码是什么意思——例如,在这种情况下,myArray从哪里来?还有一些基本的事情,比如——在哪里放置这些声明。我是一个Objective-C的初学者,在这里没有足够的上下文,我不知道你是否有教程或文档的链接,可以帮助我更好地理解你的答案? - Pete McPhearson
1
抱歉,myarray 是一个复制粘贴错误。它应该是 self。请参阅此处的文档:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html - Stephen Darlington

2

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

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

合法。

1

1

您可以创建一个类别、函数或宏来使用更简洁的代码实现此操作。

但是,如果您正在使用循环消耗大量 CPU 时间(通过使用 Instruments 进行分析确定),则应考虑改用 C 数组,这样可以使用更少的 CPU 循环访问,从而节省用户的电池寿命。如果您多次访问相同的元素,甚至将所有这些浮点数从 NSArray 复制到普通的浮点数 C 数组中,然后再执行计算循环,可能会进行优化。


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;

只是让自己不再烦恼吗?


谁是那个有趣的家伙给我回答投了反对票!为什么要这样做?我的回答真的是一个有害的想法吗?我不这么认为! - EmptyStack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接