2011-01-16 7 views
7

He leído muchas cosas sobre los tipos enum en Object-C, y veo que hay muchas maneras de definirlas. Pero no veo el camino correcto (si hay uno) para definir una enumeración que se puede llamar con CARS.ROLLSROYCE y que no se puede usar solo con ROLLSROYCE en el código.Objective-C: define una enumeración que puede llamarse como ENUMTYPE.ENUMVAL

Así puedo definir ROLLSROYCE en la enumeración CARS y también en la enumeración BEAUTIFULCARS.

¿Conoces la manera de definir dicha enumeración?

Respuesta

3

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.

+0

@Thomson Comer: esto no funciona ///// PRUEBA espacio de nombres { \t enumeración PRUEBA { \t \t ABC, DEF \t \t \t}; } – Oliver

+0

@Thomson Comer: el compilador dice "expected '='". "Etc ... 'asm' o '_attribute_' antes de 'TEST' – Oliver

+0

@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'. –

1

Para mi caso, yo no quería utilizar espacios de nombres de C++ o escribir clases de Objective-C redundantes para un caso tan simple, por lo que caído de nuevo a la C.

// Enum.h 
typedef struct 
{ 
    const int ROLLSROYCE; 
} _CARS; 

typedef struct 
{ 
    const int ROLLSROYCE; 
} _BEAUTIFULCARS; 

extern const _CARS CARS; 
extern const _BEAUTIFULCARS BEAUTIFULCARS; 

Y luego, en ENUM. m, definir los valores

// Enum.m  

#import "Enum.h" 

const _CARS CARS = {0};// 0 is to be assigned to ROLLSROYCE field in struct 
const _BEAUTIFULCARS BEAUTIFULCARS = {1}; // same but with 1 

Y, por último, en el código "principal"

#import "Enum.h" 

// Some method 
{ 
    NSLog(@"I can refer to CARS.ROLLSROYCE = %d and BEAUTIFULCARS.ROLLSROYCE = %d", CARS.ROLLSROYCE, BEAUTIFULCARS.ROLLSROYCE); 
} 

que producirá esto poner:

I can refer to CARS.ROLLSROYCE = 0 and BEAUTIFULCARS.ROLLSROYCE = 1 
Cuestiones relacionadas