Objective c 类常数

Objective c 类常数,objective-c,iphone,xcode,c-preprocessor,Objective C,Iphone,Xcode,C Preprocessor,我有几个obj-c类,每个类都需要在switch语句中使用一些常量 我曾尝试使用#define预处理器指令在.m文件中定义这些数值常量。所有这些常量都以“kCell”开头。这似乎工作得很好,但Xcode的代码感觉向我展示了每个“kCell”前缀常量,无论我在项目中的哪个位置。\define常量是否具有全局范围?如果是这样,定义纯粹的本地类常量的最佳方法是什么?这些常量不会与其他类中类似命名的常量一起分类?定义的\define常量只存在于.m文件中 如果常数是整数,您也可以在枚举中定义它们: en

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

我曾尝试使用
#define
预处理器指令在.m文件中定义这些数值常量。所有这些常量都以“kCell”开头。这似乎工作得很好,但Xcode的代码感觉向我展示了每个“kCell”前缀常量,无论我在项目中的哪个位置。
\define
常量是否具有全局范围?如果是这样,定义纯粹的本地类常量的最佳方法是什么?这些常量不会与其他类中类似命名的常量一起分类?

定义的
\define
常量只存在于
.m
文件中

如果常数是整数,您也可以在
枚举中定义它们:

enum {
  kCellSomething = 123,
  kCellAnotherThing = 456,
  ...
};

像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];
这似乎工作得很好,但Xcode的代码感觉向我展示了每个“kCell”前缀常量,无论我在项目中的哪个位置。定义常量是否具有全局范围?如果是这样的话,最好的方法是什么来定义纯粹的局部类常量,而这些常量不会与其他类中类似命名的常量进行分类

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

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

请看一下这个问题:

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

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可能是为您命名常量的更好方法。

一致的拼写错误,我喜欢(MyConstants)。您还可以将#import“MyConstants.h”放在Prefix.pch文件中,以便可以从项目中的所有.m文件访问它。但这些不是类常量。如果我有两个文件ClassA.h和ClassB.h,并且在ClassA.h中有一个常数
SomeErrorCode=1
,在ClassB.h中有一个常数
SomeErrorCode=2
,该怎么办?如何确保在调用代码中检查ClassA.SomeErrorCode和ClassB.SomeErrorCode,仍然可以得到两个不同的值,正如它们在两个.h文件中定义的那样?