用浮点数初始化NSArray?

fuz*_*oat 18 cocoa objective-c

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

NSArray *fatArray = [NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:6.9],
                    [NSNumber numberWithFloat:4.7],
                    [NSNumber numberWithFloat:6.6],
                    [NSNumber numberWithFloat:6.9],nil];
Run Code Online (Sandbox Code Playgroud)

它工作正常,只是想确保我走在正确的轨道上.

加里

zou*_*oul 32

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

#define FBOX(x) [NSNumber numberWithFloat:x]
Run Code Online (Sandbox Code Playgroud)

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

NSArray *fatArray = [NSArray arrayWithObjects:
    FBOX(6.9), FBOX(4.7), FBOX(6.6), FBOX(6.9), nil];
Run Code Online (Sandbox Code Playgroud)

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

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

- (id) initWithFloats: (int) numFloats data: (float) float1, ...;
Run Code Online (Sandbox Code Playgroud)

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


请注意,现在您只需编写以下内容:

NSArray *list = @[@6.9, @4.7, @6.6, @6.9];
Run Code Online (Sandbox Code Playgroud)

这不是一个语法梦想成真,但它得到了编译器的正式支持,它比以前的解决方案要好得多.请参阅文档以获得更多优点.