Próbujesz zaimplementować obszary nazw dla swoich elementów w Objective-C. To, o co prosisz, to dużo smaru do kolan w Objective-C. Prawdopodobnie najlepiej wykorzystujesz do tego C++, ponieważ jest to łatwe i afaik jest w pełni obsługiwany w dowolnej aplikacji iOS lub Cocoa. Będziesz musiał zmienić nazwy plików, które mają #import
swój kod C++ na pliki, a nie na pliki .m
, a kompilator C++ może być trudniejszy niż w Objective-C. Idąc tą trasą utworzysz plik nagłówkowy, taki jak Enums.h
.
// Enums.h
namespace CARS
{
enum CARS
{
ROLLSROYCE
};
}
namespace BEAUTIFULCARS
{
enum BEAUTIFULCARS
{
ROLLSROYCE = 45
};
}
I w .mm
SourceFile
#import "Enums.h"
-(void)printEnumvals
{
NSLog(@"CARS %d BEAUTIFULCARS %d",
CARS::ROLLSROYCE,
BEAUTIFULCARS::ROLLSROYCE);
}
Jeśli chcesz uniknąć używania C++ dla tego rozwiązania, jest dużo bardziej łokieć smaru, księgowość, a okazja do błędu. Będziesz potrzebował nagłówka i pliku źródłowego do tego.
// 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
Twój .m
źródłem jest prawie taka sama:
#import "CARS.h"
-(void)printEnumvals
{
NSLog(@"CARS %d BEAUTIFULCARS %d",
CARS.ROLLSROYCE,
BEAUTIFULCARS.ROLLSROYCE);
}
Objective-C nie udaje zakres w taki sam sposób, że większość innych języków OO zrobić. Interfejsy definiują właściwości i komunikaty obsługiwane przez obiekt obsługiwany przez interfejs, ale nie obsługują poziomów ochrony, takich jak publiczne czy prywatne. Po zdefiniowaniu wyliczenia w @interface
, wyliczenie kończy się zasięgiem globalnym.
@Thomson Comer: to nie działa ///// namespace {TEST TEST \t enum { \t \t ABC, \t \t DEF \t}; } – Oliver
@Thomson Comer: Kompilator wypowiada "expected" = "". "Etc ..." asm "lub" _attribute_ "przed" TEST " – Oliver
@Oliver, zapomniałeś zmienić nazwy pliku źródłowego zawierającego ten kod przestrzeni nazw do pliku '.mm' Przestrzenie nazw nie są obsługiwane w Objective-C, które zawsze mają przyrostek' .m' .Kiedy używasz przestrzeni nazw, musisz traktować ją jako kod C++, co wymaga sufiksu pliku źródłowego ' .mm'. –