类常量

时间:2010-03-04 06:52:46

标签: objective-c iphone xcode c-preprocessor

我有几个obj-c类,每个类都需要一些在switch语句中使用的常量。

我曾尝试使用#define预处理器指令在.m文件中定义这些数值常量。所有这些常数都以'kCell'开头。这似乎运作良好,但无论我在项目中的哪个位置,Xcode的代码意义都会向我呈现每个'kCell'前缀常量。 #define常量是否具有全局范围?如果是这样,那么定义纯本地类常量的最佳方法是什么,这些常量不会在其他类中使用类似命名的常量进行分类?

4 个答案:

答案 0 :(得分:34)

拥有自己的常量文件,如MyConstants。

在MyConstants.h中声明所有常量:

static const int kRedisplayTileCount = 5 ;
extern  NSString* const kCellTitleKey;

并在MyConstants.m中定义它们

NSString* const kCellTitleKey = @"CellTitle";

通过将常量保存在单独的文件中,您可以轻松跟踪它们并更改其值。

这是定义纯常量的最佳方法。这样也可以避免重复键。

只需要在其他类中导入此类:

#import "MyConstants.h"

并立即使用这些密钥:

obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey];

答案 1 :(得分:8)

我通常发现枚举最适合用于交换机:

typedef enum {
  kCellConstantOne = 1,
  kCellConstantTwo = 2, //...
} kCellConstants;

/* later */
- (void)foo:(kCellConstant)constant {
  switch (constant) {
    case kCellConstantOne:
      //do something
      break;
    case kCellConstantTwo:
      //do something else
      break;
  }
}

不幸的是,xCode不会将其代码检测(代码完成,自动完成)限制为任何特定文件。它试图找出哪些常量可以从代码的哪些区域访问,但我注意到它不是100%准确。

我建议不要使用相同的前缀启动它们。例如,如果您有两种不同类型的表格单元格,kCustomCell和kOtherCell可能是更好的方法来命名常量。

答案 2 :(得分:5)

#define常量仅存在于.m文件中。

如果常量是整数,您还可以在enum

中定义它们
enum {
  kCellSomething = 123,
  kCellAnotherThing = 456,
  ...
};

答案 3 :(得分:1)

这似乎运作良好,但无论我在项目中的哪个位置,Xcode的代码意义都会向我呈现每个'kCell'前缀常量。 #define常量是否具有全局范围?如果是这样,定义纯本地类常量的最佳方法是什么,这些常量不会在其他类中使用类似命名的常量进行分类?

Xcode代码感知和运行时可用性不相同。 Xcode还提供了selectorNames和其他在运行时不可见的项目。

.m文件中定义的所有内容在运行时都是本地的。

另请看这个问题: Constants in Objective-C