2011-01-16 9 views
7

Ho letto molte cose sui tipi di enum in ogg-c, e vedo che ci sono molti modi per definirli. Ma non vedo la strada giusta (se ce n'è una) per definire un enum che può essere chiamato con CARS.ROLLSROYCE e che non può essere usato solo con ROLLSROYCE nel codice.Objective-C - definisce un enum che può essere chiamato come ENUMTYPE.ENUMVAL

Quindi posso definire ROLLSROYCE nell'enum CARS e anche nell'enum BEAUTIFULCARS.

Conosci il modo in cui definire un enume simile?

risposta

3

Si sta tentando di implementare spazi dei nomi per l'enumerazione in Objective-C. Quello che stai chiedendo è un sacco di grasso di gomito in Objective-C. Probabilmente stai meglio usando C++ per questo, dal momento che è facile e afaik pienamente supportato in qualsiasi applicazione iOS o Cocoa. Dovrai rinominare i file che #import il tuo codice C++ in file .mm invece di .m, e il compilatore C++ può essere più complicato di quello Objective-C. Andando su questa rotta creerai un file di intestazione come Enums.h.

// Enums.h 
namespace CARS 
{ 
    enum CARS 
    { 
     ROLLSROYCE 
    }; 
} 
namespace BEAUTIFULCARS 
{ 
    enum BEAUTIFULCARS 
    { 
     ROLLSROYCE = 45 
    }; 
} 

E nel tuo .mm sourcefile

#import "Enums.h" 

-(void)printEnumvals 
{ 
    NSLog(@"CARS %d BEAUTIFULCARS %d", 
        CARS::ROLLSROYCE, 
      BEAUTIFULCARS::ROLLSROYCE); 
} 

Se si vuole evitare di utilizzare C++ per questa soluzione, c'è molto di più olio di gomito, la contabilità, e possibilità di errore. Avrai bisogno di un'intestazione e di un file sorgente per questo.

// 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 

vostra fonte .m è quasi lo stesso:

#import "CARS.h" 

-(void)printEnumvals 
{ 
    NSLog(@"CARS %d BEAUTIFULCARS %d", 
        CARS.ROLLSROYCE, 
      BEAUTIFULCARS.ROLLSROYCE); 
} 

Objective-C non riesce portata nello stesso modo che la maggior parte di altri linguaggi OO fanno. Le interfacce definiscono le proprietà e i messaggi supportati da un oggetto che supporta l'interfaccia, ma non supportano livelli di protezione come pubblici o privati. Quando si definisce un enum in un @interface, quell'enumerazione termina nell'ambito globale.

+0

@Thomson Comer: questo non funziona ///// TEST namespace { \t TEST enum { \t \t ABC, \t \t DEF \t}; } – Oliver

+0

@Thomson Comer: il compilatore dice "expected '='". "Etc ... 'asm' o '_attribute_' prima di 'TEST' – Oliver

+0

@Oliver, hai dimenticato di rinominare il file sorgente che include quel codice dello spazio dei nomi in un file '.mm'. I namespace non sono supportati in Objective-C, che sono sempre suffissi con' .m'. Quando usi uno spazio dei nomi devi trattarlo come codice C++, che richiede che il file sorgente sia suffisso ' .mm'. –

1

per il mio caso, non volevo usare i namespace C++ o scrivere classi Objective-C ridondanti per un caso così semplice, così ho caduto di nuovo alla C.

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

typedef struct 
{ 
    const int ROLLSROYCE; 
} _BEAUTIFULCARS; 

extern const _CARS CARS; 
extern const _BEAUTIFULCARS BEAUTIFULCARS; 

E poi nel Enum. m, definire i valori

// 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 

E, infine, nel codice "principale"

#import "Enum.h" 

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

che produrrà questo fuori mettere:

I can refer to CARS.ROLLSROYCE = 0 and BEAUTIFULCARS.ROLLSROYCE = 1 
Problemi correlati