第一个问题是您希望常量具有什么范围,这实际上是两个问题:
- 这些常量是特定于单个类的吗,还是在整个应用程序中都包含这些常量有意义?
- 如果它们是特定于类的,它们是供类的客户使用还是仅在类内使用?
如果它们是特定的并且在单个类内部,则将它们声明为static const
.m文件的顶部,如下所示:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果它们属于单个类,但应该由其他类公共/使用,则extern
在标头中声明它们,并在.m中定义它们:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果它们是全局的,则在标头中声明它们,并在相应的模块中定义它们,特别是对于那些常量。
您可以将它们与不同的常量混合使用,并以不同的级别使它们成为一个整体,对于不属于它们的不同的全局常量,可以将它们放在单独的模块中,如果有的话,每个模块都有自己的标头想。
为什么不#define
呢?
过去的答案是“宏没有类型信息”,但是当今的编译器非常聪明地对文字(变量扩展为宏)进行所有类型检查。
现代的答案是因为调试器不会知道您的宏。您不能[myThing addObserver:self forKey:MyThingNotificationKey]
在调试器命令中说出是否MyThingNotificationKey
是宏。调试器只能知道它是否是变量。
为什么不enum
呢?
好吧,rmaddy在注释中击败了我:enum
只能定义整数常量。诸如序列号,位掩码,四字节代码等之类的东西。
出于这些目的,enum
它很棒,您绝对应该使用它。(更妙的是,使用了NS_ENUM
和NS_OPTIONS
宏)。对于其他的东西,你必须用别的东西; enum
除整数外不执行任何操作。
和其他问题
我正在考虑将文件导入Reddit-Prefix.pch文件中,以使常量可用于所有文件。这是做事的好方法吗?
可能无害,但可能过度。将常量标头导入所需的位置。
这些解决方案的用例分别是什么?
#define
:相当有限。老实说,我不确定是否有足够的理由将其用于常量。
const
:最适合局部常量。同样,您还必须将其用于在标头中声明并正在定义的内容。
static const
:最适合于特定于文件(或特定于类)的常量。
extern const
注意:在标头中导出常量时,必须使用它。
另外,如果使用extern const
,是否需要导入文件,或者常量将在不导入文件的情况下全局可用?
您需要在使用文件的每个文件中或在前缀标头中导入文件。