1

我已经定义了一些常量,比如

#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

PS 常数标识。

是否可以?备择方案?

4

4 回答 4

1

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

您可以在此处阅读文档

#define 指令通常用于将有意义的标识符与常量、关键字和常用语句或表达式相关联。表示常数的标识符有时称为“符号常数”或“清单常数”。表示语句或表达式的标识符称为“宏”。在此预处理器文档中,仅使用术语“宏”。当宏的名称在程序源文本或某些其他预处理器命令的参数中被识别时,它被视为对该宏的调用。宏名称由宏主体的副本替换。如果宏接受参数,则宏名称后面的实际参数将替换宏体中的形式参数。

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

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

在此处输入图像描述

于 2012-12-25T11:21:49.853 回答
0

这是预处理器,只要你写keys=val_a val_a gets替换为@"A",那@"A" 就会被发送到方法中。

根据命名约定,所有的宏都应该用大写字母,这样你就不会在变量中使用相同的名称。

#define VAL_A @"A"
#define VAL_B @"B"
#define VAL_C @"C"

或者,如果您需要做类似的事情,您可以创建一个包含所有键值集的字典。

编辑:

如果您使用此定义,那么它将您传递的值转换为字符串,您可以将其存储在键中。

#define RET_NAME(n) #n

NSString *key=[NSString stringWithFormat:@"%s", RET_NAME(val_a)];

现在key将存储val_a

于 2012-12-25T11:25:13.517 回答
0

感谢您对此的关注,最后我以初学者的方式解决了它!;)

- (NSString *) actualValForKey:(NSString *)key 
 {
     NSString *str = @"";

     if([key isEqualToString:val_a])
     {
        str = @"A";
     }
     else if([key isEqualToString:val_b])
     {
        str = @"B";
     }
     .
     .
     return str;
 }

PS 需要使用与constant#define相同的名称进行更新。

于 2012-12-25T13:02:02.217 回答
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 文字语法来更轻松地创建和访问对象

于 2012-12-25T15:30:39.047 回答