2011-01-16 12 views
7

Czytałem wiele rzeczy o typach enum w celu-c, i widzę, że istnieje wiele sposobów ich definiowania. Ale nie widzę właściwej drogi (jeśli jest taka), aby zdefiniować wyliczenie, które można nazwać CARS.ROLLSROYCE i które nie może być użyte tylko z ROLLSROYCE w kodzie.Objective-C - zdefiniuj wyliczenie, które może być kropką o nazwie tak jak ENUMTYPE.ENUMVAL

Dzięki temu mogę zdefiniować ROLLSROYCE w wyliczeniu CARS, a także w wyliczeniu BEAUTIFULCARS.

Czy znasz sposób zdefiniowania takiego wyliczenia?

Odpowiedz

3

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.

+0

@Thomson Comer: to nie działa ///// namespace {TEST TEST \t enum { \t \t ABC, \t \t DEF \t}; } – Oliver

+0

@Thomson Comer: Kompilator wypowiada "expected" = "". "Etc ..." asm "lub" _attribute_ "przed" TEST " – Oliver

+0

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

1

Na moim przypadku, nie chcę używać nazw C++ lub napisać zbędnych klas Objective-C na takim prostym przypadku, więc spadł z powrotem do C

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

typedef struct 
{ 
    const int ROLLSROYCE; 
} _BEAUTIFULCARS; 

extern const _CARS CARS; 
extern const _BEAUTIFULCARS BEAUTIFULCARS; 

A potem w Enum. m, zdefiniować wartości

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

i wreszcie w "głównym" kodu

#import "Enum.h" 

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

Która to będzie produkować się umieścić:

I can refer to CARS.ROLLSROYCE = 0 and BEAUTIFULCARS.ROLLSROYCE = 1 
Powiązane problemy