我已经定义了一些像
这样的常量#define val_a @"A"
#define val_b @"B"
#define val_c @"C"
现在我有一些键与我定义的常量同名,我想打印常量值(不使用常量键)。我试过了,
- (NSString *) actualValForKey:(NSString *)key
{
return key; //It will return **key** parameter, but I want to return the **constant value** as defined
}
我可以像NSLog(@"Value = %@", [self actualValForKey:keys]);
那样写,因为所有键都是动态的,我不能用这种方式写NSLog(@"Value = %@", val_a);
。
此处keys
将成为NSString
。
P.S。不断识别。
有可能吗?替代?
答案 0 :(得分:1)
在C ++ / ObjectiveC中,您无法在运行时获取宏的名称。因为,宏名称被宏体的副本替换。
您可以阅读文档here
#define指令通常用于关联有意义的 带有常量,关键字和常用语句的标识符 表达式。有时会调用表示常量的标识符 “符号常量”或“显式常量”。标识符 表示语句或表达式称为“宏”。在这 预处理器文档,仅使用术语“宏”。当。。。的时候 宏的名称在程序源文本或。中识别 某些其他预处理器命令的参数,它被视为一个 打电话给那个宏。宏名称替换为宏的副本 身体。如果宏接受参数,则接下来是实际参数 宏名称替换宏中的形式参数 身体。用处理过的副本替换宏调用的过程 身体被称为宏观呼唤的“扩张”。
但是,如果你真的需要。您可以编写构建脚本,它解析文件中的所有#define
指令并创建NSDictionary。您可以在代码中使用哪个。
例如,我添加了一个文件。这显示了脚本的正确使用。
答案 1 :(得分:0)
这是预处理器,只要您将keys=val_a
val_a gets
替换为@“A”,并且@“A”将被发送到该方法。
根据命名约定,所有宏都应使用大写字母,这样您就不会在变量中使用相同的名称。
#define VAL_A @"A"
#define VAL_B @"B"
#define VAL_C @"C"
或者如果你需要做类似的事情,你可以用一组keyValues创建一个字典。
编辑:
如果您使用此定义,则它会将传递的值转换为字符串,您可以将其存储在密钥中。
#define RET_NAME(n) #n
NSString *key=[NSString stringWithFormat:@"%s", RET_NAME(val_a)];
现在key
将存储val_a
。
答案 2 :(得分:0)
感谢您关注此事,最后我以初学者的方式解决了这个问题! ;)
- (NSString *) actualValForKey:(NSString *)key
{
NSString *str = @"";
if([key isEqualToString:val_a])
{
str = @"A";
}
else if([key isEqualToString:val_b])
{
str = @"B";
}
.
.
return str;
}
P.S。需要更新#define
,其名称与常量相同。
答案 3 :(得分:0)
我通过以下方式异常地分隔名称和值,使用#defines或const字符串来定义事物的名称,然后将实际值填充到字典中。原因是,与普通的#define相比,这将更有效地为您的值迁移到外部源。它也适用于其他方法,如NSUserDefaults,例如(这是袖口)
#define kNameForThing
#define kNameForOtherThing
- (void) initValues {
// _defaults is a NSDictionary
_defaults = @{
kNameForThing : @"A",
KNameForOtherThing : @"B"
};
}
- (void) useValue {
NSString value = _defaults[kNameForThing];
....
}
你可以进行各种一致性测试,检查是否存在所有预期密钥存在的值,依此类推,如果从文件中加载此信息,这就变得更加重要
从长远来看,使用更具表现力的名字也会对你有所帮助。 这是使用新的目标c文字语法,以便更轻松地创建和访问对象