如何使用保存其名称的String访问常量

时间:2012-08-24 16:22:36

标签: objective-c macos cocoa

我有一个.h文件,定义了几百个常量。我们假设这是其中之一:

#define KDSomeItem      1

我知道Objective-C运行时API可用于检索实例变量名称列表:如此问题中详述:How do I list all fields of an object in Objective-C? 我也知道getter [object valueForKey:theName]可用于访问我之前的问题中的ivars:How to access a property/variable using a String holding its name

我的问题是可以用常数完成一些事情吗?那是我可以:

a)以编程方式获取所有常量的列表

b)如果我有一个名字

的字符串,则访问一个常量

e.g。如果我有这样的字符串NSString * theName = @"KDSomeItem";我可以用这个字符串来评估我的常量吗?

2 个答案:

答案 0 :(得分:1)

你将无法做到这一点:与实例变量不同,#define - d常量在预处理器完成之后不会留下痕迹。它们不会留下任何元数据 - 即使在Objective C编译器正确分析代码之前,程序正文中KDSomeItem的所有实例都将替换为1

如果您需要在运行时提供常量名称,则需要自己构建所有必需的元数据。为此,您可能需要查看预处理器的“stringizing”运算符:

#define STR(X) #X

此宏可以应用于预处理器常量,并生成一个C字符串文字,其名称为:

const char *nameOfKDSomeItem = STR(KDSomeItem); // same as "KDSomeItem"

答案 1 :(得分:0)

不。您的常量是预处理器宏。它以文本方式替换为您使用它的源代码。