Objective c 类常数
我有几个obj-c类,每个类都需要在switch语句中使用一些常量 我曾尝试使用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
#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文件中定义的那样?