Está intentando implementar espacios de nombres para sus entradas en Objective-C. Lo que estás pidiendo es mucha grasa en Objective-C. Probablemente sea mejor usar C++ para esto, ya que es fácil y afaik totalmente compatible en cualquier aplicación iOS o Cocoa. Tendrá que cambiar el nombre de los archivos que #import
su código C++ a archivos .mm
en lugar de .m
, y el compilador C++ puede ser más complicado que el Objective-C. Al seguir esta ruta, creará un archivo de encabezado como Enums.h
.
// Enums.h
namespace CARS
{
enum CARS
{
ROLLSROYCE
};
}
namespace BEAUTIFULCARS
{
enum BEAUTIFULCARS
{
ROLLSROYCE = 45
};
}
Y en su .mm
SourceFile
#import "Enums.h"
-(void)printEnumvals
{
NSLog(@"CARS %d BEAUTIFULCARS %d",
CARS::ROLLSROYCE,
BEAUTIFULCARS::ROLLSROYCE);
}
Si desea evitar el uso de C++ para esta solución, hay mucha más grasa del codo, teneduría de libros, y una oportunidad para el error. Necesitarás un encabezado y un archivo fuente para esto.
// 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
Su fuente .m
es casi el mismo:
#import "CARS.h"
-(void)printEnumvals
{
NSLog(@"CARS %d BEAUTIFULCARS %d",
CARS.ROLLSROYCE,
BEAUTIFULCARS.ROLLSROYCE);
}
Objective-C no logra el alcance de la misma manera que la mayoría de otros lenguajes orientados a objetos hacen. Las interfaces definen las propiedades y los mensajes que un objeto compatible con esa interfaz, pero no admiten niveles de protección como públicos o privados. Cuando define una enumeración en @interface
, esa enumeración termina en alcance global.
@Thomson Comer: esto no funciona ///// PRUEBA espacio de nombres { \t enumeración PRUEBA { \t \t ABC, DEF \t \t \t}; } – Oliver
@Thomson Comer: el compilador dice "expected '='". "Etc ... 'asm' o '_attribute_' antes de 'TEST' – Oliver
@Oliver, olvidó cambiar el nombre del archivo fuente que incluye ese código de espacio de nombres a un archivo '.mm'. Los espacios de nombres no son compatibles con Objective-C, que siempre tienen el sufijo' .m'. Cuando usa un espacio de nombres, debe tratarlo como código C++, que requiere que el archivo fuente tenga el sufijo ' .mm'. –