【问题标题】:iPhone : access constant valuesiPhone:访问常量值
【发布时间】:2012-12-25 11:07:59
【问题描述】:

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

#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 出现。

附:不断识别。

有可能吗?替代品?

【问题讨论】:

  • keys=val_a; NSLog(@"Value = %@", [self actualValForKey:keys]);
  • 我已经更清楚地编辑了问题。我不知道会使用哪些键,所有都会动态出现。
  • `我有一些与我定义的常量同名的键`意味着您可以将 val_a 作为键?还是 @"A" 作为键?
  • 当然val_a keyAvalue
  • 请检查我的回答并评论你的工作完成了吗?

标签: objective-c ios cocoa-touch constants


【解决方案1】:

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

您可以阅读文档here

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

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

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

【讨论】:

    【解决方案2】:

    这是预处理器,只要你写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

    【讨论】:

      【解决方案3】:

      感谢您的关注,我终于以初学者的方式解决了它! ;)

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

      附:需要更新 #defineconstant 同名。

      【讨论】:

        【解决方案4】:

        我通常用以下方式将名称和值分开,使用#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 文字语法来更轻松地创建和访问对象

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-23
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          相关资源
          最近更新 更多