@class для typedef enum? - PullRequest
       9

@class для typedef enum?

20 голосов
/ 06 мая 2011

В одном заголовочном файле у меня есть что-то вроде:

// 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?

Ответы [ 4 ]

14 голосов
/ 06 мая 2011

Нет, эквивалент отсутствует.

Перечисления в Objective-C такие же, как перечисления в C. Поскольку базовый тип перечисления зависит от реализации (например, это может быть char или int), компилятор должен знать полное объявление Перечень.

Тем не менее, спецификатор типа

enum nameOfEnum

без перечисления членов перечисления действителен C при условии, что он появляется после указанный тип завершен, т. Е. enum nameOfEnum { … } должен предварительно отображаться в единице перевода.

В итоге: нет предварительного объявления перечислений, только обратные ссылки.

3 голосов
/ 06 февраля 2017

@ Caleb, @Bavarious:

Самый последний способ (январь 2017 г.) переслать объявление перечисления (NS_ENUM / NS_OPTION) в target-c заключается в использовании следующего:

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

Аналогичный вопрос Перечислить в Objective-C

0 голосов
/ 06 мая 2011

Предварительное объявление классов необходимо, чтобы два класса могли ссылаться друг на друга.Весьма распространено иметь два класса, которые определены в терминах друг друга:

@class ClassB;

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

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

Нет способа сделать это компиляцией без предварительного объявления.

То же самое не верно для перечислений,enum просто создает набор именованных значений ... вы не можете включить одно перечисление в определение другого.Следовательно, никогда не возникает необходимость в объявлении перечисления вперед.

0 голосов
/ 06 мая 2011

Я думаю, что вам нужен класс, который имеет PasscodeInputMode как его свойство.Таким образом, вы можете обойти созданный объект этого класса, а также установить / получить это свойство и делать с ним другие объектоподобные вещи (предположим, что именно поэтому вы захотите найти «эквивалент @class»

...