objective-c - 如何使用保存名称的字符串来访问常量

标签 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) 如果我有一个保存常量名称的字符串,则访问常量

例如如果我有一个像这样的字符串 NSString * theName = @"KDSomeItem"; 我可以使用这个字符串来评估我的常量吗?

最佳答案

您将无法执行此操作:与实例变量不同,#define -d 常量在预处理器处理完后不会留下痕迹。他们没有留下任何元数据 - KDSomeItem 的所有实例程序主体中的内容将替换为 1甚至在 Objective C 编译器正确分析您的代码之前。

如果您需要在运行时使用常量名称,则需要自己构建所有必要的元数据。为此,您可能需要研究预处理器的“字符串化”运算符:

#define STR(X) #X

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

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

关于objective-c - 如何使用保存名称的字符串来访问常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12113167/

相关文章:

c++ - 将 Objective C "code blocks"转换为 C++ 中的等价物

objective-c - 以编程方式创建 NSTableView(无法显示 NSHeaderView)(cocoa osx)

iphone - 关于iPhone中的正则表达式

macos - 创建看起来像按钮的工具栏项

ios - Swift 无法为 UITextField 调用添加目标

iphone - 错误 : Creating Tab-Navigation programmatically

iphone - 应用程序与 iphone 5 屏幕尺寸的兼容性

macos - 从环境变量中删除路径

objective-c - 如何在全屏应用程序中处理 Cocoa 事件

objective-c - NSInvocation 无参数