зачем использовать строковые константы против констант enum? - PullRequest
9 голосов
/ 01 сентября 2011

У меня вопрос по дизайну.

Я видел, что класс 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;  

Один предназначен для уведомлений, а другой определяет типы объектов. Я полагаю, что эти два варианта являются выбором для «маркировки» некоторых связанных объектов и принятия решений во время выполнения на основе этого флага.

Допустим, я хочу создать фабрику объектов, которые нужно пометить. На изображении ниже я хочу перечисления или идентификаторы для каждого раздела и виджета. Как любой виджет будет общаться или «вызывать» другой? E.J. [[Container sharedInstance] presentWidget: ?? forSection: ?? withInfo: (идентификатор) Информация];

enter image description here

Есть ли более глубокая или более точная причина выбрать один из них? Спасибо за вашу помощь.

Ответы [ 2 ]

8 голосов
/ 01 сентября 2011

Объявление enum является , а не структурой, синтаксис аналогичен, но он просто определяет серию именованных чисел.

Эти константы относятся к двум различным типам типов данных: строка против числа.

Именованные константы в UIApplications являются указателями на NSString объекты , у них есть значение указателя, а также есть строковая константа, на которую они указывают (которая находится в файле .m). Вроде как объявление некоторых строковых констант, подобных этой (за исключением того, что они являются внешними и определение завершено в другом месте):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification";

Именованные константы в UITableViewScrollPosition - это имена, присвоенные целочисленным значениям. Вроде как:

const int UITableViewScrollPositionNone = 0;

Причиной использования перечисления (именованных чисел) в одном случае является то, что они определяют все возможные значения по сравнению со строковой константой, они определяют несколько значений, но пользователи могут определять другие. С помощью строковых констант разные библиотеки могут определять свои собственные без какой-либо вероятности повторения строковых адресов, тогда как определение расширений перечислений может иметь коллизии между разными библиотеками, если они определяют одно и то же целочисленное значение, чтобы иметь разные значения.

0 голосов
/ 01 сентября 2011

звучит так, как будто вам нужно свойство enum для объекта. so object.UITableViewScrollPosition

если вы объявите константы в своем классе, вы не сможете изменить их для определенного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...