@class for typedef enum?

问题描述 投票:20回答:4

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

// 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是否有typedef enum

objective-c enums typedef
4个回答
14
投票

不,没有相应的。

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

那就是一个类型说明符

enum nameOfEnum

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

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


3
投票

@Caleb,@ Bavarious:

最近的方式(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


0
投票

为了使两个类能够相互引用,必须进行类的前向声明。有两个相互定义的类并不罕见:

@class ClassB;

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

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

没有前向声明就没有办法进行编译。

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.