@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
?
Ответы
Ответ 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"