Как объявить свойство класса как тип перечисления
Я хочу объявить пользовательское перечисление, например:
enum menuItemType
{
LinkInternal = 0,
LinkExternal = 1,
Image = 2,
Movie = 3,
MapQuery = 4
}
Как тип для моего объекта:
@interface MenuItem : NSObject {
NSMutableString *menuId;
NSMutableString *title;
enum menuItemType *menuType;
NSMutableArray *subMenuItems;
}
Но я не уверен, где мне нужно поместить определение перечисления - если я поставил перед @interface его синтаксически неправильный
Ответы
Ответ 1
Если вы поместите два фрагмента кода в файл в этом порядке, вам просто нужно добавить ;
в конце объявления перечисления, и вы можете захотеть использовать переменную enum вместо указателя на перечисление переменная.
Это дает:
enum menuItemType
{
LinkInternal = 0,
LinkExternal = 1,
Image = 2,
Movie = 3,
MapQuery = 4
};
@interface MenuItem : NSObject {
NSMutableString *menuId;
NSMutableString *title;
enum menuItemType menuType;
NSMutableArray *subMenuItems;
}
Ответ 2
Просто обновляя это, если кто-то наткнется на это в наши будущие времена.
Так как iOS 6
/Mac OS X 10.8
, новые макросы NS_ENUM
и NS_OPTIONS
являются предпочтительным способом объявления типов перечислений.
В этом случае он будет выглядеть так:
typedef NS_ENUM(NSInteger, MenuItemType) {
LinkInternal = 0,
LinkExternal = 1,
Image = 2,
Movie = 3,
MapQuery = 4
};
@interface MenuItem : NSObject {
NSMutableString *menuId;
NSMutableString *title;
MenuItemType menuType;
NSMutableArray *subMenuItems;
}
Хорошее чтение по теме: http://nshipster.com/ns_enum-ns_options/
Вы также можете согласиться с соглашениями Apple об именах перечислений и пойти на что-то вроде:
typedef NS_ENUM(NSInteger, MenuItemType) {
MenuItemTypeLinkInternal = 0,
MenuItemTypeLinkExternal = 1,
MenuItemTypeImage = 2,
MenuItemTypeMovie = 3,
MenuItemTypeMapQuery = 4
};
Надеюсь, это поможет.
Ответ 3
@mouviciel прав, но я думал, что дам вам знать, что вы хотите не свойство класса, что не поддерживается в Objective-C. Свойство класса фактически является глобальным свойством, которое задано в классе-объекте. То, о чем вы думали, было просто старым свойством (установлено на экземпляре класса).
Кроме того, ваш код показывает, что вы просто используете переменную экземпляра. Переменные экземпляра можно преобразовать в свойства, добавив методы accessor/mutator следующим образом:
// after @interface {}
@property (readwrite) enum menuItemType menuType;
и
// under @implementation
@synthesize menuType;
Это ярлык: компилятор будет генерировать правильные методы для доступа и изменения свойства menuType
. Я не уверен, насколько это полезно для вас, но это поможет вам понять семантику Objective-C.