iPhone:访问常量值

时间:2012-12-25 11:08:00

标签: objective-c ios cocoa-touch constants

我已经定义了一些像

这样的常量
#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。不断识别。

有可能吗?替代?

4 个答案:

答案 0 :(得分:1)

在C ++ / ObjectiveC中,您无法在运行时获取宏的名称。因为,宏名称被宏体的副本替换

您可以阅读文档here

  

#define指令通常用于关联有意义的   带有常量,关键字和常用语句的标识符   表达式。有时会调用表示常量的标识符   “符号常量”或“显式常量”。标识符   表示语句或表达式称为“宏”。在这   预处理器文档,仅使用术语“宏”。当。。。的时候   宏的名称在程序源文本或。中识别   某些其他预处理器命令的参数,它被视为一个   打电话给那个宏。宏名称替换为宏的副本   身体。如果宏接受参数,则接下来是实际参数   宏名称替换宏中的形式参数   身体。用处理过的副本替换宏调用的过程   身体被称为宏观呼唤的“扩张”。

但是,如果你真的需要。您可以编写构建脚本,它解析文件中的所有#define指令并创建NSDictionary。您可以在代码中使用哪个。

例如,我添加了一个文件。这显示了脚本的正确使用。

enter image description here

答案 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文字语法,以便更轻松地创建和访问对象