2011-08-31 97 views
8

我有一个设计相关的问题。为什么使用字符串常量与枚举常量?

我见过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

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

+0

注意,要先将一个字符串的“集合”,其中第二将是一个整数的选择(开始@ 0) – KevinDTimm

+0

随着什么凯文说,我不相信你会成功的字符串枚举。枚举非常适合分组标签。在我的公司,我们通常会明确设置枚举值,以防我们决定在路上删除枚举值。一些保持状态的代码可能会使用枚举值来指示状态,但是如果您加载应用程序的新版本并删除了一个值,则会影响枚举中的所有值,除非它们被明确指定。 – Sam

+0

我想到的一件事是,对于字符串,您不必知道将接收这些字符串的对象的接口。通过枚举,涉及的每个对象都可以知道接收者接口...我是对的吗? – chuckSaldana

回答

8

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

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

在UIApplications命名常量是指向的NSString 对象,他们有一个指针值,并且也有一个字符串常量,它们指向(这是在.m文件)。有点像宣称的一些字符串常量,像这样的(除非他们是extern和定义在其他地方完成):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification"; 

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

const int UITableViewScrollPositionNone = 0; 

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

+0

你可以为FourCharCodes(OSType等)切换到UTI做类似的参数:你可以把一些数据标记为'“com.bigco.document”',而不用担心别人已经使用这个标识符,但是找到四个没有其他人声称的Mac OS罗马字符('BgCo'?)要困难得多。您可以扩大数字范围以允许更多字符,但仍然存在使用字符串标识符时不存在的人为上限。 –

+0

对。如果你定义了两个具有相同标识符名称的字符串常量,你将会得到一个链接器错误,你不能有重复的外部标识符。同样,你不能有重复的反向域名,假设他们是真实的注册域名。 – progrmr

0

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

如果你声明你的类中的常量,你将不能够改变这些特定对象。