我想定义很多常量和不规则值,如下所示:
#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的任何其他有效用法?
答案 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]