用浮点数初始化NSArray?

时间:2009-10-05 09:49:19

标签: objective-c cocoa

这是使用浮动对象初始化NSArray的有效方法吗?

NSArray *fatArray = [NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:6.9],
                    [NSNumber numberWithFloat:4.7],
                    [NSNumber numberWithFloat:6.6],
                    [NSNumber numberWithFloat:6.9],nil];

它有效且感觉正确,只是想确保我走在正确的轨道上。

加里

6 个答案:

答案 0 :(得分:32)

正如mouviciel已经写过的,这是做到这一点的方法。当我写这样的东西时,我通常使用一个简单的宏来缩短代码:

#define FBOX(x) [NSNumber numberWithFloat:x]

然后你可以像这样重写代码:

NSArray *fatArray = [NSArray arrayWithObjects:
    FBOX(6.9), FBOX(4.7), FBOX(6.6), FBOX(6.9), nil];

宏是邪恶的,但在这种情况下,宏是如此简单,我会使用它。此外,代码对读取的伤害要小一些,尤其是在宏定义不远的情况下。

如果您编写了大量这样的代码,您可以使用带有可变数量的float参数的自定义初始化程序创建一个类别,但是在结束参数列表时会出现问题。您可以先传递浮点数总数:

- (id) initWithFloats: (int) numFloats data: (float) float1, ...;

但手工计算参数很容易出错。或者你可以使用一些标记参数列表末尾的标记值,例如零,但是这会打开一个叫做浮点比较的全新蠕虫。


请注意,现在您可以简单地写下以下内容:

NSArray *list = @[@6.9, @4.7, @6.6, @6.9];

这不是一个语法梦想成真,但它得到了编译器的正式支持,它比以前的解决方案要好得多。 See the documentation for more goodness

答案 1 :(得分:4)

据我所知,这是一种将浮动物放入NSArray的完全有效的方法。

答案 2 :(得分:3)

如果要做的只是存储一个浮点数并且不需要添加NSArray或NSNumber的功能,那么你应该只考虑一个标准的C数组:

float fatArray[] = {6.6, 6.9, 4.7, 6.9};

答案 3 :(得分:1)

我同意mouviciel。由于您无法将简单类型放入Array中,因此这是一种方法。看起来有点奇怪,需要编写很多代码,但它很好。

答案 4 :(得分:1)

如果您要创建大量具有完全相同元素数量的数组,则可以定义一个实现类似以下内容的FloatArrayFactory类:

+ (NSArray *) arrayWithFloat: (float)f;
+ (NSArray *) arrayWithFloat: (float)f1 and: (float)f2;
+ (NSArray *) arrayWithFloat: (float)f1 and: (float)f2 and: (float)f3;
+ (NSArray *) arrayWithFloat: (float)f1 and: (float)f2 and: (float)f3 and: (float)f4;

如果那太冗长,你可以去看看未命名参数的简洁外观:

+ (NSArray *) arr: (float)f1 : (float)f2 : (float)f3;

你可以像这样打电话:

NSArray *a = [Factory arr: 1.0 :2.0 :3.0 :4.0];

答案 5 :(得分:1)

另一个懒惰的选择是只使用NSStrings数组,然后直接从字符串中获取您要查找的值类型。

像这样:

NSArray *arrayOfNumbers = [NSArray arrayWithObjects:@"3.12",@"3.2", @"12", @"15", nil];
float number = [[arrayOfNumbers objectAtIndex:0] floatValue];