Подтвердить что ты не робот

Как объявить свойство класса как тип перечисления

Я хочу объявить пользовательское перечисление, например:

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 его синтаксически неправильный

4b9b3361

Ответ 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.