如何动态调用常量值?

时间:2014-06-24 12:14:15

标签: ios objective-c dynamic constants c-preprocessor

我想定义很多常量和不规则值,如下所示:

#define LEVEL_01 2.0f
#define LEVEL_02 3.0f
#define LEVEL_03 5.0f
#define LEVEL_04 8.5f
#define LEVEL_05 10.0f
#define LEVEL_06 15.0f

如何动态获取值?

即。

int n ;
float = <NSString stringWithFormat:@"LEVEL_%.2i", n>;

我可以做得好吗?或者Objective-C的任何其他有效用法?

2 个答案:

答案 0 :(得分:2)

您应该使用预定义的常量值而不是预处理器定义。这样做的原因之一是---预处理器定义不是动态的,它们甚至不是“静态代码”。它们只是C / C ++预处理器的文本替换命令,在编译器进入之前操作C源代码。

C / C ++编译器甚至不知道你的LEVEL_0X常量。它只看到他们的评价

float a = 2.0f;

相反,您应该声明并定义包含值

的不可变变量
const float LEVEL_01 = 2.0f;
const float LEVEL_02 = 3.0f;
const float LEVEL_03 = 5.0f;
const float LEVEL_04 = 8.5f;
const float LEVEL_05 = 10.0f;
const float LEVEL_06 = 15.0f;

并改为使用它们。这当然是一种“C”式解决方案。您可能想要一些更优雅和更高级别的东西,可用于Objective-C中的抽象。然后我会推荐一个不可变NSNictionary的不可变NSDictionary。

NSDictionary *levels = @[@"LEVEL_01":@(2.0f), 
                        @"LEVEL_02":@(3.0f),
                        @"LEVEL_03":@(5.0f),
                        @"LEVEL_04":@(8.5.0f),
                        @"LEVEL_05":@(10.0f),
                        @"LEVEL_06":@(15.0f)};

然后将它们作为

float val2 = levels[@"LEVEL_02"].floatValue;

您也可以使用Enum路径,按名称声明您的级别(但不使用浮点值)或跳转到新的Swift托架,并在第一个地方忘记预处理器,并且具有强类型的任何类型的枚举值

答案 1 :(得分:1)

不能动态获取#define值。至少不是直接的,您可以使用这些值创建一个数组并访问它们:

NSArray *levelData = @[ @(LEVEL_01), @(LEVEL_02), @(LEVEL_03), @(LEVEL_04), @(LEVEL_05), @(LEVEL_06) ];

int n = 2;
float currentValue = [levelData[n] floatValue]