2011-04-04 57 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