如何将类属性声明为枚举类型

时间:2010-01-22 09:47:41

标签: objective-c iphone

我想声明一个自定义枚举,例如:

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之前它的语法不正确

3 个答案:

答案 0 :(得分:15)

如果有人在我们未来的时间里发现这种情况,请更新此内容。

iOS 6 / Mac OS X 10.8以来,新的NS_ENUMNS_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
};

希望这会有所帮助。

答案 1 :(得分:10)

如果按此顺序将两个代码段放在一个文件中,则只需在枚举声明的末尾添加;,您可能需要考虑使用枚举变量而不是指向枚举变量。

这给出了:

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 :(得分:5)

@mouviciel是对的,但我想我会告诉你,你想要的不是类属性,Objective-C不支持。类属性实际上是在类对象上设置的全局属性。你在想的是一个普通的属性(在类的实例上设置)。

此外,您的代码显示的是您只是使用实例变量。可以通过添加accessor / mutator方法将实例变量转换为属性,如下所示:

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

// under @implementation
@synthesize menuType;

这是一个捷径:编译器将生成访问和更改menuType属性的正确方法。我不确定这对你有多大帮助,但它会帮助你理解Objective-C语义。