【问题标题】:Constant value of NSString representationNSString 表示的常量值
【发布时间】:2013-01-13 14:30:45
【问题描述】:

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

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

现在,当我读出值时,我得到一个 NSString。如何获取我之前定义的常量的值

#define STANDARDVALUEFORCERTAININSTANCE 123

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

【问题讨论】:

  • 可能是&lt;integer&gt;123&lt;/integer&gt;?
  • 它与整数无关...我还有一些#defined 常量是字符串。它更多的是关于获取字符串的常量值。有点像这个 php 函数:php.net/constant
  • 可能您必须在构建过程中添加一个处理步骤,以预处理您的 plist 源文件以进行替换。我怀疑,对于脚本大师来说,这是一项微不足道的任务,但不是我能想到的。

标签: objective-c nsstring constants c-preprocessor


【解决方案1】:

你想做的事情并不完全可能。使用#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>

【讨论】:

  • NSSelectorFromString() 根据读取的字符串执行选择器并返回一个值。为什么不 valueForKey: 那么呢?
  • @RamyAlZuhouri 这当然是另一种选择,只要键对应于返回常量值的方法。这就是您在回答中所指的吗?如果是这样,我没有想到这就是我发布此建议的原因。
  • 是的,我的回答与使用属性(因此也会生成访问器)而不是选择器这一事实不同。
【解决方案2】:

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

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

@property (nonatomic,assign) int standardValueForCertainInstance;

然后你用 valueForKey 得到值:

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

【讨论】:

  • KVC 如何帮助解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多