【问题标题】:why use string constants vs enum constants?为什么使用字符串常量与枚举常量?
【发布时间】:2011-08-31 20:54:00
【问题描述】:

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

我看到 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. [[容器共享实例] presentWidget:??对于部分:?? withInfo:(id)info];

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

【问题讨论】:

  • 请注意,第一个是字符串的“集合”,第二个是整数的选择(从 @ 0 开始)
  • 按照凯文所说的,我不相信你可以制作一个字符串枚举。枚举非常适合对标签进行分组。在我的公司,我们通常会明确设置枚举值,以防我们决定在以后删除枚举值。一些保持状态的代码可能使用枚举值来指示状态,但是如果您加载应用程序的新版本并删除了某个值,这将影响枚举中的所有值,除非它们被明确指定。
  • 我想到的一件事是,对于字符串,您不必知道将接收这些字符串的对象的接口。使用枚举,涉及的每个对象都会知道接收器接口......我说的对吗?

标签: objective-c ios design-patterns


【解决方案1】:

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

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

UIApplications 中的命名常量是指向 NSStringobjects 的指针,它们有一个指针值,还有一个它们指向的字符串常量(在 .m 文件中)。有点像像这样声明一些字符串常量(除了它们是外部的并且定义在其他地方完成):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification";

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

const int UITableViewScrollPositionNone = 0;

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

【讨论】:

  • 您可以为从 FourCharCodes(OSType 等)到 UTI 的切换提出类似的论点:您可以将某些数据标记为 "com.bigco.document",而不必担心其他人已经在使用该标识符,但发现没有其他人声称的四个 Mac OS 罗马字符 ('BgCo'?) 要困难得多。您可以扩大数字的范围以允许更多字符,但是在使用字符串标识符时仍然存在不存在的人为上限。
  • 对。如果你定义了两个具有相同标识符名称的字符串常量,你会得到一个链接器错误,你不能有重复的外部标识符。同样,您不能有重复的反向域名,假设它们是真实的注册域名。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多