NSString表示的常量值

时间:2013-01-13 14:30:46

标签: objective-c nsstring constants c-preprocessor

我有一个PList,我在字典中加载了几行数据。我想添加一行像

<key>StandardValue</key>
<string>STANDARDVALUEFORCERTAININSTANCE</string>

现在当我读出值时,我得到一个NSString。如何获得我之前使用

定义的常量的值
#define STANDARDVALUEFORCERTAININSTANCE 123

有没有办法获得字符串的常量表示?所以基本上解析它?

2 个答案:

答案 0 :(得分:0)

你不能这样做。我建议一个不错的选择:KVC。

您将此变量声明为类实例:

@property (nonatomic,assign) int standardValueForCertainInstance;

然后使用valueForKey获取值:

NSString* key= dict[@"StandardValue"];
int value= [[self valueForKey: key] intValue];

答案 1 :(得分:0)

你想要做的事情是不可能的。使用#define创建的常量仅存在于编译时,并且在运行时无法通过名称访问它们 - 它们已经转换为常量值。

可能存在的一种替代方法是定义一些返回常量值的方法,比如在Constants类中。然后,在运行时,从plist加载方法的名称,并使用NSSelectorFromString()performSelector:进行调用。

然而,可能的问题是,为了安全performSelector:,您必须将所有常量重写为Objective-C对象(因为performSelector:返回类型id)。这可能非常不方便。

尽管如此,这是Constants类的示例实现:

@implementation Constants : NSObject

+ (NSNumber *)someValueForACertainInstance
{
    return @123;
}

@end

示例用法:

NSDictionary *infoDotPlist = [[NSBundle mainBundle] infoDictionary];
NSString *selectorName = infoDotPlist[@"StandardValue"];
SEL selector = NSSelectorFromString(selectorName);
NSNumber *result = [Constants performSelector:selector];

选择器名称将如何存储在info plist中:

<key>StandardValue</key>
<string>someValueForACertainInstance</string>