@class for typedef enum?

ma1*_*w28 21 enums typedef objective-c

在一个头文件中,我有类似的东西:

// PasscodeInputViewController.h

typedef enum {
    PasscodeInputModeOn,     // set passcode
    PasscodeInputModeEnter,  // enter passcode
    PasscodeInputModeChange, // change passcode
    PasscodeInputModeOff     // turn off passcode
} PasscodeInputMode;
Run Code Online (Sandbox Code Playgroud)

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

#import "PasscodeInputViewController.h"

- (void)presentPasscodeInputWithMode:(PasscodeInputMode)mode;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我使用#import "PasscodeInputViewController.h"如上所述,因此PasscodeInputMode被认可,但是有@class相同的typedef enum吗?

小智 14

不,没有相应的.

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

那就是一个类型说明符

enum nameOfEnum
Run Code Online (Sandbox Code Playgroud)

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

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


lal*_*lal 5

@Caleb,@Bvarious:

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

// 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 */`
Run Code Online (Sandbox Code Playgroud)

Objective-C 中的类似问题Forward-declare enum