2011-04-04 61 views
1

我有一大堆的声明如下常量的名称:一个转换成NSString的一个恒

#define kConstant0 @"Cow" 
#define kConstant1 @"Horse" 
#define kConstant2 @"Zebra" 

其他地方的代码我试图通过增加的字符串名称的整数提取恒定值恒:

int myInt = 1; // (Actual intValue Pulled From Elsewhere) 
myLabel.text = [@"kConstant" stringByAppendingString:[NSString stringWithFormat:@"%i",myInt]]; 

但当然这将返回:

myLabel.text = @"kConstant1"; 

当我想它返回:

myLabel.text = @"Horse"; 

我想不出如何将NSString @“kConstant1”转换为常量名称kConstant1。

任何帮助表示赞赏。 lq

回答

2

你不能自动做到这一点。您必须将映射存储在NSDictionary中,例如

@implementation MyClass 
static NSDictionary* constants; 
+(void)initialize { 
    constants = [[NSDictionary alloc] initWithObjectsAndKeys: 
            @"kConstant0", @"Cow", 
            @"kConstant1", @"Horse", ..., 
            nil]; 
} 
... 

NSString* constantName = [kConstant stringByAppendingString:...]; 
myLabel.text = [constants objectForKey:constantName]; 

如果所有这些常量的形式为kConstantN,最好只创建一个数组。

static NSString* kConstants[] = {@"Cow", @"Horse", @"Zebra", ...}; 
... 

myLabel.text = kConstants[i]; 
+0

这样做,非常感谢。我试图脱离创建另一个数组来做这件事,因为我已经有了这个常量的名字,虽然在NSString形式中。 – 2011-04-04 19:10:54

4

答案是为了避免#defines完全定义常量。使用NSString常数这样,而不是:

NSString * const constant1 = @"Cow"; 

最大的好处是,现在不断有型,是关于类型安全好得多。

+0

我很欣赏这个建议。为我的下一个努力提供一个好建议。 – 2011-04-04 19:02:19

+0

它只是非常容易调试和更干净。随时upvote答案;-)。 – GorillaPatch 2011-04-04 19:03:29