我在@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。
感谢您的帮助
答案 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);
}