@class for typedef enum?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@class for typedef enum?相关的知识,希望对你有一定的参考价值。

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

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

那就是一个类型说明符

enum nameOfEnum

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

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

另一答案

@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

另一答案

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

@class ClassB;

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

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

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

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

另一答案

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

以上是关于@class for typedef enum?的主要内容,如果未能解决你的问题,请参考以下文章

枚举类型 typedef enum....; enum....; 这两个的区别

C语言 enum和typedef enum的区别

enum sizeof typedef分析

怎么遍历dictionary<enum,class>输出

typedef enum与typedef struct分别是啥意思

李洪强iOS开发之 - enum与typedef enum的用法