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.
fonte
2011-01-16 04:08:19
@Thomson Comer: questo non funziona ///// TEST namespace { \t TEST enum { \t \t ABC, \t \t DEF \t}; } – Oliver
@Thomson Comer: il compilatore dice "expected '='". "Etc ... 'asm' o '_attribute_' prima di 'TEST' – Oliver
@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'. –