我有一个与设计相关的问题。
我已经看到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)信息];
是否有更深入或更准确的理由选择其中之一? 谢谢你的帮助。
答案 0 :(得分:8)
枚举声明不是结构,语法类似,但它只是定义了一系列命名数字。
这些常量指的是两种不同的数据类型,字符串与数字。
UIApplications中的命名常量是指向NSString 对象的指针,它们有一个指针值,并且还有一个它们指向的字符串常量(位于.m文件中)。有点像声明这样的一些字符串常量(除了它们是extern并且定义在别处完成):
NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification";
UITableViewScrollPosition中的命名常量是赋予整数值的名称。有点像:
const int UITableViewScrollPositionNone = 0;
在一种情况下使用枚举(命名数字)的原因是它们定义了所有可能的值而不是字符串常量,它们定义了一些值,但用户可以定义其他值。对于字符串常量,不同的库可以各自定义它们自己而不会有重复的字符串地址,而定义枚举的扩展可能会在不同的库之间发生冲突,如果它们定义相同的整数值以具有不同的含义。
答案 1 :(得分:0)
听起来你需要在对象上使用枚举属性。所以object.UITableViewScrollPosition
如果在类中声明常量,则无法更改特定对象的常量。