【问题标题】:How to make NSString macro?如何制作 NSString 宏?
【发布时间】:2011-10-17 13:09:08
【问题描述】:

如何制作一个表示常量 NSString 值的宏?我越来越 在 Xcode 4 中定义时出现“多字符字符常量”和“字符常量对于它的类型而言太长”警告:

#define LEVELTYPEGLASS @"Glass"

我需要逃避什么吗?

【问题讨论】:

  • 没错。你到底是如何使用它的?
  • 检查您的拼写,是否有@ 字符以及是否使用双双引号。可能是错字,或者告诉我们你把这段代码放在哪里
  • 我在支持文件组中有一个单独的宏文件。这个头文件是在-Prefix.pch中导入的

标签: objective-c macros xcode4 nsstring


【解决方案1】:

避免对字符串常量使用定义。在头文件中定义为 extern,如下所示:

extern NSString * const MYLevelTypeGlass;

并且它们在任何实现文件中实现:

NSString * const MYLevelTypeGlass = @"Glass";

这提供了更多的字符来输入,但增加了许多好处,比如更好的 Xcode 输入,保证对象标识(没有重复的字符串)。苹果就是这样做的,如果它对他们来说足够好,它应该对你有好处。

【讨论】:

  • 嗯,这个解决方案有点打破了我的工作惯例 :( 目前,我所有的宏都驻留在一个宏头文件中,该头文件自动包含在我的所有自定义类中。
  • 您介意解释一下为什么我们应该避免只使用定义来执行此操作吗?不是质疑,只是好奇。
  • 我提到的原因; Xcode 和编译器获得更好的类型处理(例如重构)和相等性。你可以在你的代码中做foo == MYLevelTypeGlass,它是安全的。
  • @Centurion - 没有什么能阻止您将所有定义的NSString 常量放在一个自动包含的头文件中。您可以使用相同的文件,如果您愿意,可以使用相同的名称。
  • 是的,但是您建议将实际常量值放在任何实现文件中(NSString * const MYLevelTypeGlass = @"Glass"; )。恕我直言,在这种情况下,@“Glass”的值从我的宏文件移动到其他地方。请好心澄清一下,我认为我错过了 smth :) 我只需要将所有常量值(宏)存储在一个头文件中。
【解决方案2】:

Peylow 建议的解决方案很棒。但我只想指出,在将#import "Foundation/Foundation.h" 添加到头文件后,我的解决方案可以正常工作。所以头文件 Constants.h 应该是这样的:

#import "Foundation/Foundation.h"

extern NSString * const LEVELTYPEGLASS; 
#define IMAGECOUNT 5
...

然后,实现文件如下:

#import "Constants.h"

NSString * const LEVELTYPEGLASS = @"Glass";

如果您需要将其包含到整个项目中,则需要将其导入 -Prefix.pch 文件中:

#import "Constants.h"

在这种情况下,所有的宏定义都驻留在 Constants.h 头文件中,一些 NSString 常量驻留在 Constants.m 实现文件中。再次感谢 Peylow :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多