Вы пытаетесь реализовать пространства имен для своих перечислений в Objective-C. То, что вы просите, это много смазки локтя в Objective-C. Вероятно, вам лучше всего использовать C ++ для этого, поскольку он легко и полностью поддерживается в любом приложении iOS или Cocoa. Вам придется переименовывать файлы, которые #import
ваш код C ++, в .mm
файлы вместо .m
файлов, и компилятор C ++ может быть хитрее, чем Objective-C. По этому маршруту вы создадите заголовочный файл, например Enums.h
.
// Enums.h
namespace CARS
{
enum CARS
{
ROLLSROYCE
};
}
namespace BEAUTIFULCARS
{
enum BEAUTIFULCARS
{
ROLLSROYCE = 45
};
}
И в вашем .mm
исходном файле
#import "Enums.h"
-(void)printEnumvals
{
NSLog(@"CARS %d BEAUTIFULCARS %d",
CARS::ROLLSROYCE,
BEAUTIFULCARS::ROLLSROYCE);
}
Если вы хотите избежать использования C ++ для этого решения, вам понадобится гораздо больше смазки для локтя, бухгалтерии и возможностей для ошибок. Для этого вам понадобится заголовок и исходный файл.
// CARS.h
@interface BEAUTIFULCARS : NSObject
{
enum
{
BEAUTIFULCARS_ROLLSROYCE = 45
} BEAUTIFULCARS;
}
@end
@interface CARS : NSObject
{
enum
{
CARS_ROLLSROYCE
} CARS;
}
@end
// CARS.m
@implementation BEAUTIFULCARS
+(NSInteger)ROLLSROYCE{ return BEAUTIFULCARS_ROLLSROYCE; }
@end
@implementation CARS
+(NSInteger)ROLLSROYCE{ return CARS_ROLLSROYCE; }
@end
Ваш .m
источник почти такой же:
#import "CARS.h"
-(void)printEnumvals
{
NSLog(@"CARS %d BEAUTIFULCARS %d",
CARS.ROLLSROYCE,
BEAUTIFULCARS.ROLLSROYCE);
}
Objective-C не управляет областью так же, как большинство других языков ОО. Интерфейсы определяют свойства и сообщения, которые поддерживает объект, который поддерживает интерфейс, но не поддерживают уровни защиты, такие как публичные или частные. Когда вы определяете перечисление в @interface
, это перечисление попадает в глобальную область видимости.