2011-01-16 2 views
7

Ich habe viele Dinge über Enum-Typen in objective-c gelesen, und ich sehe, es gibt viele Möglichkeiten, sie zu definieren. Aber ich sehe nicht den richtigen Weg (wenn es einen gibt), eine Aufzählung zu definieren, die mit CARS.ROLLSROYCE aufgerufen werden kann und die nicht nur mit ROLLSROYCE im Code verwendet werden kann.Objective-C - Definieren Sie eine Enum als kann Punkt aufgerufen werden wie ENUMTYPE.ENUMVAL

So kann ich ROLLSROYCE in der CARS enum und auch in der BEAUTIFULCARS enum definieren.

Kennen Sie den Weg, eine solche Enum zu definieren?

Antwort

3

Sie versuchen, Namespaces für Ihre Enums in Objective-C zu implementieren. In Objective-C ist eine Menge Ellenbogenfett gefragt. Sie sind wahrscheinlich am besten mit C++ dafür, da es einfach und afaik vollständig in jeder iOS oder Cocoa-Anwendung unterstützt wird. Sie müssen die Dateien, die #import Ihren C++ - Code zu .mm Dateien anstelle von .m Dateien umbenennen, und der C++ - Compiler kann kniffliger sein als der Objective-C. Auf dieser Route erstellen Sie eine Header-Datei wie Enums.h.

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

Und in Ihrem .mm Quell

#import "Enums.h" 

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

Wenn Sie C++ für diese Lösung vermeiden wollen, gibt es viel mehr Fett Ellenbogen, Buchhaltung und Gelegenheit für Fehler. Dazu benötigen Sie eine Kopfzeile und eine Quelldatei.

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

Ihre .m Quelle ist fast das gleiche:

#import "CARS.h" 

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

Objective-C nicht Umfang in der gleichen Art und Weise gelingt, die meisten anderen OO-Sprachen zu tun. Schnittstellen definieren die Eigenschaften und Meldungen, die ein Objekt unterstützt, das von der Schnittstelle unterstützt wird, unterstützen jedoch keine Schutzstufen wie öffentlich oder privat. Wenn Sie eine Enum in einem @interface definieren, endet diese Enum im globalen Gültigkeitsbereich.

+0

@Thomson Beteiligt: ​​dies nicht funktioniert ///// Namespace TEST { \t Enum TEST { \t \t ABC, \t \t DEF \t}; } – Oliver

+0

@Thomson Comer: Der Compiler sagt "erwartet '='". "Etc ... 'asm' oder '_attribute_' vor 'TEST' – Oliver

+0

@Oliver, haben Sie vergessen, die Quelldatei umzubenennen, die diesen Namespace-Code enthält zu einer '.mm' Datei Namespaces werden in Objective-C nicht unterstützt, denen immer' .m' vorangestellt wird. Wenn Sie einen Namespace verwenden, müssen Sie ihn als C++ Code behandeln, der eine Suffix der Quelldatei erfordert ' .mm'. –

1

Für meinen Fall wollte ich nicht C++ Namespaces oder schreiben redundante Objective-C-Klassen für einen solchen einfachen Fall verwenden, so dass ich auf die C.

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

typedef struct 
{ 
    const int ROLLSROYCE; 
} _BEAUTIFULCARS; 

extern const _CARS CARS; 
extern const _BEAUTIFULCARS BEAUTIFULCARS; 

Und dann in Enum zurückgefallen. m, definieren Werte

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

Und schließlich in der "main" Code

#import "Enum.h" 

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

Welche wird diese produzieren out setzen:

I can refer to CARS.ROLLSROYCE = 0 and BEAUTIFULCARS.ROLLSROYCE = 1 
Verwandte Themen