我知道之前会问这些问题。我查看了网络查找示例,但我无法弄清楚如何在我的代码中使用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_NONE
是undefined
。
编辑2:
我理解这个问题。我在NS_ENUM
文件中声明了.h
(正如一些评论和答案所示),错误消失了。我以前尝试过,但在那种情况下我没有正确使用枚举 - 我使用的是wsErrEnum.ERR_NONE
。 10x寻求帮助。
P.S。我的类在.m文件中是#imported
,我尝试进行此比较。
答案 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_NONE
为0
,ERR_HOST_TIMEOUT
为1
。
但你也可以按照你的方式重视枚举:
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