Ответ 1
Ваш typedef
должен находиться в файле заголовка (или другом файле, который #import
ed в ваш заголовок), потому что иначе компилятор не будет знать, какой размер сделать PlayerState
ivar. Кроме этого, мне все равно.
Я объявил перечисление в моем файле реализации, как показано ниже, и объявил переменную этого типа в моем интерфейсе как PlayerState thePlayerState; и использовал переменную в моих методах. Но я получаю ошибки, заявляя, что он не объявлен. Как правильно объявить и использовать переменную типа PlayerState в моих методах?:
В файле .m
@implementation View1Controller
typedef enum playerStateTypes
{
PLAYER_OFF,
PLAYER_PLAYING,
PLAYER_PAUSED
} PlayerState;
в файле .h:
@interface View1Controller : UIViewController {
PlayerState thePlayerState;
в некотором методе в .m файле:
-(void)doSomethin{
thePlayerState = PLAYER_OFF;
}
Ваш typedef
должен находиться в файле заголовка (или другом файле, который #import
ed в ваш заголовок), потому что иначе компилятор не будет знать, какой размер сделать PlayerState
ivar. Кроме этого, мне все равно.
Apple предоставляет макрос, чтобы обеспечить лучшую совместимость с кодом, включая Swift. Использование макроса выглядит следующим образом.
typedef NS_ENUM(NSInteger, PlayerStateType) {
PlayerStateOff,
PlayerStatePlaying,
PlayerStatePaused
};
В .h:
typedef enum {
PlayerStateOff,
PlayerStatePlaying,
PlayerStatePaused
} PlayerState;
В текущих проектах вы можете использовать макросы NS_ENUM()
или NS_OPTIONS()
.
typedef NS_ENUM(NSUInteger, PlayerState) {
PLAYER_OFF,
PLAYER_PLAYING,
PLAYER_PAUSED
};
Вот как Apple делает это для таких классов, как NSString:
В файле заголовка:
enum {
PlayerStateOff,
PlayerStatePlaying,
PlayerStatePaused
};
typedef NSInteger PlayerState;
Обратитесь к Руководству по кодированию в http://developer.apple.com/
Я рекомендую использовать NS_OPTIONS или NS_ENUM. Подробнее об этом можно прочитать здесь: http://nshipster.com/ns_enum-ns_options/
Вот пример из моего собственного кода с использованием NS_OPTIONS, у меня есть утилита, которая устанавливает подуровень (CALayer) на уровне UIView для создания границы.
h. Файл:
typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
BSTCMBOrderNoBorder = 0,
BSTCMBorderTop = 1 << 0,
BSTCMBorderRight = 1 << 1,
BSTCMBorderBottom = 1 << 2,
BSTCMBOrderLeft = 1 << 3
};
@interface BSTCMBorderUtility : NSObject
+ (void)setBorderOnView:(UIView *)view
border:(BSTCMBorder)border
width:(CGFloat)width
color:(UIColor *)color;
@end
Файл .m:
@implementation BSTCMBorderUtility
+ (void)setBorderOnView:(UIView *)view
border:(BSTCMBorder)border
width:(CGFloat)width
color:(UIColor *)color
{
// Make a left border on the view
if (border & BSTCMBOrderLeft) {
}
// Make a right border on the view
if (border & BSTCMBorderRight) {
}
// Etc
}
@end