为什么使用字符串常量vs枚举常量?

时间:2011-08-31 20:54:01

标签: objective-c ios design-patterns

我有一个与设计相关的问题。

我已经看到UIApplication类有这种标志:

UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification;
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification;
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification;
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification;

,另一方面,类UITableView声明结构如:

typedef enum {
    UITableViewScrollPositionNone,        
    UITableViewScrollPositionTop,    
    UITableViewScrollPositionMiddle,   
    UITableViewScrollPositionBottom
} UITableViewScrollPosition;  

一个用于通知,另一个用于定义对象的类型。我相信这两个是设计选择,可以“标记”一些相关对象,并根据该标志在运行时进行分类。

假设我想创建一个需要标记的对象工厂。 在下面的图像中,我想要每个部分和小部件的枚举或ID。任何小部件如何通信或“调用”另一个小部件? E.J。 [[Containter sharedInstance] presentWidget:?? forSection:?? withInfo:(ID)信息];

enter image description here

是否有更深入或更准确的理由选择其中之一? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:8)

枚举声明不是结构,语法类似,但它只是定义了一系列命名数字。

这些常量指的是两种不同的数据类型,字符串与数字。

UIApplications中的命名常量是指向NSString 对象的指针,它们有一个指针值,并且还有一个它们指向的字符串常量(位于.m文件中)。有点像声明这样的一些字符串常量(除了它们是extern并且定义在别处完成):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification";

UITableViewScrollPosition中的命名常量是赋予整数值的名称。有点像:

const int UITableViewScrollPositionNone = 0;

在一种情况下使用枚举(命名数字)的原因是它们定义了所有可能的值而不是字符串常量,它们定义了一些值,但用户可以定义其他值。对于字符串常量,不同的库可以各自定义它们自己而不会有重复的字符串地址,而定义枚举的扩展可能会在不同的库之间发生冲突,如果它们定义相同的整数值以具有不同的含义。

答案 1 :(得分:0)

听起来你需要在对象上使用枚举属性。所以object.UITableViewScrollPosition

如果在类中声明常量,则无法更改特定对象的常量。