在iOS中如何使用NS_ENUM?

时间:2014-09-30 12:35:37

标签: ios objective-c

我知道之前会问这些问题。我查看了网络查找示例,但我无法弄清楚如何在我的代码中使用NS_ENUM。 我有一个错误代码列表。要管理它们,我想使用NS_ENUM。我创建了一个包含应用程序的所有公共const的类。我想在这里定义我的枚举,并在应用程序的任何地方使用它。

我的代码在.h文件中:

typedef NS_ENUM(NSInteger, wsErrEnum); 

在我的.m文件中:

typedef NS_ENUM(NSInteger, wsErrEnum) {
    ERR_NONE = 0,
    ERR_HOST_TIMEOUT = 1
};

我认为我可以通过以下方式检查:

if(result.ErrCode == wsErrEnum.ERR_NONE) {
// do stuff ...
}

,但ERR_NONE不可见为属性。

所以我的问题是如何在这种情况下定义和使用NS_ENUM

修改

使用

if(result.ErrCode == ERR_NONE) {
            NSLog(@"It is OK!");
        }

我错误ERR_NONEundefined

编辑2:

我理解这个问题。我在NS_ENUM文件中声明了.h(正如一些评论和答案所示),错误消失了。我以前尝试过,但在那种情况下我没有正确使用枚举 - 我使用的是wsErrEnum.ERR_NONE。 10x寻求帮助。

P.S。我的类在.m文件中是#imported,我尝试进行此比较。

3 个答案:

答案 0 :(得分:2)

此处唯一的问题是您已在.m文件中声明了枚举值。

您应该在.h文件中声明整个枚举(包含值)。通过声明.h文件中的枚举类型wsErrNum和.m文件中的值,您已隐藏了所有其他类中的值。

所以,在你的.h文件中:

typedef NS_ENUM(NSInteger, wsErrEnum) {
    ERR_NONE = 0,
    ERR_HOST_TIMEOUT = 1
};

您的.m文件中不需要声明此枚举。

答案 1 :(得分:0)

在斯威夫特:

if result.ErrCode == wsErrEnum.ERR_NONE {
   // do stuff ...
}

在Objective-C中:

if(result.ErrCode == ERR_NONE) {
   // do stuff ...
}

真正的问题是你已将wsErrEnum的声明拆分,将其从.m文件中删除,并将完整的存储放在.h中:

typedef NS_ENUM(NSInteger, wsErrEnum) {
    ERR_NONE = 0,
    ERR_HOST_TIMEOUT = 1
};

但更好的是:

typedef NS_ENUM(NSInteger, wsErrEnum) {
    wsErrEnumName = 0,
    wsErrEnumTimeOut = 1
};

只是一个小小的评论,像ErrCode这样的属性不应该以大写字母开头。

答案 2 :(得分:0)

通常,我将objective-c中的Enumerations用作typedef enum。这样做,您不需要实现文件(.m),代码如下所示:

//  Enumerations.h

@interface Enumerations

typedef enum:int {
    ERR_NONE,
    ERR_HOST_TIMEOUT
} wsErrEnum;

@end

默认情况下,编译器将枚举值从0到N,按顺序对它们进行声明。在上面的示例中,ERR_NONE0ERR_HOST_TIMEOUT1

但你也可以按照你的方式重视枚举:

typedef enum:int {
    ERR_NONE = 0,
    ERR_HOST_TIMEOUT = 504
} wsErrEnum;

然后,您可以使用switch并考虑您的枚举,因此如果您没有实现一个可能的结果,它会发出警告,例如:

switch(result.ErrCode) {
     case ERR_NONE:
     //implementation
         break;
}

上面的代码会警告您,您没有为ERR_HOST_TIMEOUT实施案例。

您还可以在文件Enumerations.h中导入YourProjectName-Prefix.phc,以便在洞项目中使用它。

//
//  Prefix header
//
//  The contents of this file are implicitly included at the beginning of every source file.
//

#import <Availability.h>

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iOS SDK 3.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
    #import "Enumerations.h" //Add this line so you don't have to import your .h file every time you use it
#endif