2013-01-13 19 views
0

我有一个PList,我在字典中加载了几行数据。我想添加一条线如NSString表示的常量值

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

现在,当我读出值我得到一个NSString。我怎样才能得到我以前定义的常量的值

#define STANDARDVALUEFORCERTAININSTANCE 123 

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

+1

也许''? –

+0

它与整数无关......我也有一些#defined常量是字符串。它更多的是获取字符串的常量值。有点像这个PHP函数:http://php.net/constant – Joseph

+0

也许你不得不在编译过程中添加一个处理步骤,来预处理你的plist源文件来做替换。对于剧本导师来说,这是一项微不足道的任务,我怀疑,但不是我能做的事。 –

回答

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]; 

以及如何选择的名字将被存储在信息的plist:

<key>StandardValue</key> 
<string>someValueForACertainInstance</string> 
+0

NSSelectorFromString()根据读取的字符串执行一个选择器并返回一个值。为什么不valueForKey:然后呢? –

+0

@RamyAlZuhouri这当然是一种替代方案,只要该键对应于返回常量值的方法即可。这是你在回答中提到的吗?如果是这样,我没有发现这是我发布这个建议的原因。 –

+0

是的,我的答案不同于使用属性(所以也生成访问器)而不是选择器的事实。 –

0

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

你声明这个变量的类实例:

@property (nonatomic,assign) int standardValueForCertainInstance; 

那么你得到的值与valueForKey:

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

KVC如何解决此问题? –

+0

用你看到的方式(我编辑了答案)。 –