如何使用保存其名称的字符串在运行时访问常量字符串?

时间:2013-11-13 09:34:22

标签: objective-c runtime

我在@implementation文件中定义了一些常量字符串,如:

static NSString * const contentDisplayDateKeyPath   = @"content.display_date";
static NSString * const contentIDKeyPath            = @"content.id";

我是否可以获取contentDisplayDateKeyPath的内容使用在运行时保存变量名称的字符串?

例如:

NSString *constantName = @"contentDisplayDateKeyPath"

[self valueForKey:constantName] 

然后我会得到content.display_date

这可以实现吗?

我试图通过使用CFBundleGetDataPointer

来实现这一目标
    CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(CFBridgingRetain([[NSBundle mainBundle] bundleIdentifier]));
    void *stringPointer = CFBundleGetDataPointerForName(mainBundle, CFBridgingRetain(obj));
    NSString *string = (__bridge NSString *)stringPointer;

但stringPointer始终为null。

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

这应该为你做。

struct S {
  virtual int f(char) const, g(int) &&;
};

struct D : S {
  virtual int f(char) const override;
  virtual int g(int) && override;
};

答案 1 :(得分:0)

使用带有键作为常量名称的映射,将值作为常量值:

static NSDictionary *_constants = @{

    @"contentDisplayDateKeyPath" : @"content.display_date",
    @"contentIDKeyPath"          : @"content.id",
    // etc.
};

...

NSString *constantName = @"contentDisplayDateKeyPath";
NSString *constantValue = _constants[constantName];

答案 2 :(得分:0)

另一种选择是将其封装到单个对象中,并通过只读属性访问常量。查看What should my Objective-C singleton look like?以查看单件设计模式。

答案 3 :(得分:0)

这个问题在这里得到了回答:

  

How do I lookup a string constant at runtime in Objective-C?

解决方案对我来说非常合适。

您可以使用CFBundleGetDataPointerForName在运行时查找常量值

-(NSString *)lookupStringConstant:(NSString *)constantName 
{

    void ** dataPtr = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), (__bridge CFStringRef)constantName);
    return (__bridge NSString *)(dataPtr ? *dataPtr : nil);
}