我有一个PList,我在字典中加载了几行数据。我想添加一条线如NSString表示的常量值
<key>StandardValue</key>
<string>STANDARDVALUEFORCERTAININSTANCE</string>
现在,当我读出值我得到一个NSString。我怎样才能得到我以前定义的常量的值
#define STANDARDVALUEFORCERTAININSTANCE 123
有没有办法获得字符串的常量表示?所以基本上要解析它?
我有一个PList,我在字典中加载了几行数据。我想添加一条线如NSString表示的常量值
<key>StandardValue</key>
<string>STANDARDVALUEFORCERTAININSTANCE</string>
现在,当我读出值我得到一个NSString。我怎样才能得到我以前定义的常量的值
#define STANDARDVALUEFORCERTAININSTANCE 123
有没有办法获得字符串的常量表示?所以基本上要解析它?
你想要做的是不完全的可能。使用#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>
NSSelectorFromString()根据读取的字符串执行一个选择器并返回一个值。为什么不valueForKey:然后呢? –
@RamyAlZuhouri这当然是一种替代方案,只要该键对应于返回常量值的方法即可。这是你在回答中提到的吗?如果是这样,我没有发现这是我发布这个建议的原因。 –
是的,我的答案不同于使用属性(所以也生成访问器)而不是选择器的事实。 –
你不能这样做。我建议一个很好的选择:KVC。
你声明这个变量的类实例:
@property (nonatomic,assign) int standardValueForCertainInstance;
那么你得到的值与valueForKey:
NSString* key= dict[@"StandardValue"];
int value= [[self valueForKey: key] intValue];
KVC如何解决此问题? –
用你看到的方式(我编辑了答案)。 –
也许''? –
它与整数无关......我也有一些#defined常量是字符串。它更多的是获取字符串的常量值。有点像这个PHP函数:http://php.net/constant – Joseph
也许你不得不在编译过程中添加一个处理步骤,来预处理你的plist源文件来做替换。对于剧本导师来说,这是一项微不足道的任务,我怀疑,但不是我能做的事。 –