@class for typedef enum?

时间:2011-05-06 03:44:15

标签: objective-c enums typedef

在一个头文件中,我有类似的内容:

// PasscodeInputViewController.h

typedef enum {
    PasscodeInputModeOn,     // set passcode
    PasscodeInputModeEnter,  // enter passcode
    PasscodeInputModeChange, // change passcode
    PasscodeInputModeOff     // turn off passcode
} PasscodeInputMode;

在另一个头文件中,我声明了一个带有PasscodeInputMode类型参数的方法:

#import "PasscodeInputViewController.h"

- (void)presentPasscodeInputWithMode:(PasscodeInputMode)mode;

正如您所看到的,我使用#import "PasscodeInputViewController.h",因为PasscodeInputMode已被识别,但@class的{​​{1}}是否相同?

4 个答案:

答案 0 :(得分:14)

不,没有相应的。

Objective-C中的枚举与C中的枚举相同。由于枚举的基础类型是依赖于实现的(例如,它可能是charint),编译器必须知道完整的枚举声明。

那就是一个类型说明符

enum nameOfEnum

没有列出枚举成员是有效的C,前提是 它指定的类型是完整的,即enum nameOfEnum { … }必须事先出现在翻译单元中。

总结:没有枚举的前向声明,只有向后引用。

答案 1 :(得分:3)

@Caleb,@ Babarious:

最近的方式(2017年1月)转发在objective-c中声明枚举(NS_ENUM / NS_OPTION)是使用以下内容:

// Forward declaration for XYZCharacterType in other header say XYZCharacter.h
typedef NS_ENUM(NSUInteger, XYZCharacterType);


// Enum declaration header: "XYZEnumType.h"
#ifndef XYZCharacterType_h
#define XYZCharacterType_h

typedef NS_ENUM(NSUInteger, XYZEnumType) {
    XYZCharacterTypeNotSet,
    XYZCharacterTypeAgent,
    XYZCharacterTypeKiller,
};

#endif /* XYZCharacterType_h */`

类似问题Forward-declare enum in Objective-C

答案 2 :(得分:0)

为了使两个类能够相互引用,必须进行类的前向声明。有两个按照彼此定义的类是很常见的:

@class ClassB;

@interface ClassA : NSObject
{
    ClassB *objectB;
}
@end

@interface ClassB : NSObject
{
    ClassA *objectA;
}
@end

如果没有前瞻性声明,就没有办法进行编译。

枚举也是如此。 enum只创建一组命名值...您不能在另一个的定义中包含一个枚举。因此,永远不需要转发声明枚举。

答案 3 :(得分:-1)

我认为你想要的是一个将PasscodeInputMode作为其属性的类。这样你就可以传递该类的实例化对象,并可以设置/获取该属性,并使用它做其他类似对象的事情(假设这就是为什么你想要找到“@class等价物”