Подтвердить что ты не робот

@class для перечисления typedef?

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

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

4b9b3361

Ответ 1

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

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

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

enum nameOfEnum

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

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

Ответ 2

@Caleb, @Bavarious:

Последний способ (январь 2017 г.) для пересылки объявить перечисление (NS_ENUM/NS_OPTION) в objective-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

Ответ 3

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

@class ClassB;

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

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

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

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

Ответ 4

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