Как объявить свойство класса как тип перечисления - PullRequest
11 голосов
/ 22 января 2010

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

enum menuItemType
{
    LinkInternal = 0,
    LinkExternal = 1,
    Image = 2,
    Movie = 3,
    MapQuery = 4
}

Как тип для моего объекта:

@interface MenuItem : NSObject {    
    NSMutableString *menuId;
    NSMutableString *title;
    enum menuItemType *menuType;
    NSMutableArray *subMenuItems;
}

Но я не уверен, где мне нужно поместить определение enum - если я поставлю его перед @interface, его синтаксически неверно

Ответы [ 3 ]

15 голосов
/ 21 января 2014

Просто обновите это на случай, если кто-то наткнется на это в наше будущее.

Поскольку 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 по присвоению имен enum и пойти на что-то вроде:

typedef NS_ENUM(NSInteger, MenuItemType) {
    MenuItemTypeLinkInternal = 0,
    MenuItemTypeLinkExternal = 1,
    MenuItemTypeImage = 2,
    MenuItemTypeMovie = 3,
    MenuItemTypeMapQuery = 4
};

Надеюсь, это поможет.

10 голосов
/ 22 января 2010

Если вы поместите два фрагмента кода в файл в таком порядке, вам просто нужно добавить ; в конце объявления enum, и вы можете рассмотреть возможность использования переменной enum вместо указателя на 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;
}
5 голосов
/ 23 января 2010

@ mouviciel прав, но я подумал, что дам вам знать, что вы хотите не свойство класса, что не поддерживается в Objective-C. Свойство класса на самом деле является глобальным свойством, которое устанавливается для объекта класса. То, о чем вы думали, было простым старым свойством (установленным для экземпляра класса).

Кроме того, ваш код показывает, что вы просто используете переменную экземпляра. Переменные экземпляра можно превратить в свойства, добавив методы доступа / мутатора следующим образом:

// after @interface {}
@property (readwrite) enum menuItemType menuType;

и

// under @implementation
@synthesize menuType;

Это ярлык: компилятор сгенерирует подходящие методы для доступа и изменения свойства menuType. Я не уверен, насколько это все полезно для вас, но это поможет вам понять семантику Objective-C.

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