目标c-共享常量定义变量的标准是什么



正如标题所说,在Java中,我只需要让一个类定义常量,然后将它们导入将要使用它们的类中。在Objective-C中也是这样做的吗?

为了清楚起见,我想

#define variable 1
#define variable 2.0

并在不同的类中使用相同的常量。

将宏放在一个头文件中,并在需要访问它们时将#include#import放在该头文件中。

使用宏还有另一种选择。您可以将它们定义为全局变量。

在常数中。h:

extern int variableX;
extern float variableY;

在Constants.m中(通常在导入之后,在任何其他代码之前):

int variableX = 1;
float variableY = 2.0f;

与宏相比,这种方法有几个优点:

  1. 客户不需要看到价值
  2. 如果值发生更改,则无需重新编译导入Constants.h的每个文件
  3. 这些值可以通过多种不同的方式初始化,而不仅仅是使用文字
  4. 使用变量时的类型安全性和编译器检查

您的示例是使用C预处理器宏。这与Objective-C在任何其他支持C风格预处理器宏的环境中的工作原理相同:将它们粘贴到共享的头中,然后#import#include

虽然这完全可以,但您询问的是与类相关的常量,尤其是Objective-C。在Objective-C中,您经常会看到常量NSString(例如通知名称或字典键)和类似的常量,它们属于这样定义的特定类:

在标题(.h)中:

extern NSString * const LibraryEntryDidUpdateNotification;
extern const NSUInteger LibraryEntryDefaultStarRating;
@interface LibraryEntry : NSObject
...

在实现中(.m):

NSString * const LibraryEntryDidUpdateNotification = @"LibraryEntryDidUpdateNotification";
const NSUInteger LibraryEntryDefaultStarRating = 3;
@implementation LibraryEntry
...

这就是苹果在其现代框架中的做法,也是许多第三方开发人员的做法。在我看来,重构比预处理器宏更容易(例如,当使用Xcode中的"重构"按钮重命名类时,同样的方法很容易用于这些常量),但用于常量的预处理器宏也有其好处。

如果您感兴趣,请参阅此处和此处,以便对该主题进行更深入的讨论。

最新更新