ma11hew28
ma11hew28

Reputation: 126457

@class for typedef enum?

In one header file, I have something like:

// PasscodeInputViewController.h

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

In another header file, I declare a method that takes an argument of type PasscodeInputMode:

#import "PasscodeInputViewController.h"

- (void)presentPasscodeInputWithMode:(PasscodeInputMode)mode;

As you can see, I use #import "PasscodeInputViewController.h" as above so that PasscodeInputMode is recognized, but is there a @class equivalent for typedef enum?

Upvotes: 23

Views: 10008

Answers (4)

lal
lal

Reputation: 8140

@Caleb, @Bavarious:

Most recent way (Jan, 2017) to forward declare the enum (NS_ENUM/NS_OPTION) in objective-c is to use the following:

// 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 */`

Similar question Forward-declare enum in Objective-C

Upvotes: 5

Caleb
Caleb

Reputation: 125007

Forward declaration of classes is necessary to enable two classes to refer to each other. It's not uncommon to have two classes that are defined in terms of each other:

@class ClassB;

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

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

There's no way to make that compile without the forward declaration.

The same is not true of enumerations. enum just creates a set of named values... you can't include one enumeration in the definition of another. Therefore, there's never a need to forward declare an enumeration.

Upvotes: 0

user557219
user557219

Reputation:

No, there isn’t an equivalent.

Enumerations in Objective-C are the same as enumerations in C. Since the underlying type of an enumeration is implementation-dependent (e.g., it could be char or int), the compiler must know the complete declaration of the enumeration.

That said, a type specifier

enum nameOfEnum

without listing the enumeration members is valid C provided it appears after the type it specifies is complete, i.e., enum nameOfEnum { … } must appear beforehand in the translation unit.

In summary: There’s no forward declaration of enumerations, only backward references.

Upvotes: 14

Nektarios
Nektarios

Reputation: 10351

I think what you want is a class that has PasscodeInputMode as a property of it. That way you can be passing around an instantiated object of that class, and can set/get that property, and do other object-like-things with it (assume that's why you'd want to find a "@class equivalent"

Upvotes: -1

Related Questions